- •Практическая работа. Бизнес-транзакции и транзакции sql Server
- •Управление изоляцией транзакций
- •Мониторинг блокировок
- •Уровень изоляции транзакции
- •Используем только чтение зафиксированных данных
- •Применяем уровень изоляции read commited
- •Применяем уровень изоляции read commited snapshot
- •Как добиться согласованных повторяющихся операций чтения
- •Применяем уровень изоляции snapshot
- •Как предотвратить параллельные изменения данных
- •Применяем уровень изоляции repeatable read
- •Применяем уровень изоляции serializable
- •Борьба с блокированиями
- •Выполняем мониторинг блокирований при помощи динамических административных представлений
- •Борьба с взаимоблокировками
- •Разыгрываем простой сценарий взаимоблокировки
- •5. Закройте все окна запросов.
Применяем уровень изоляции read commited snapshot
Запустите SQL Server Management Studio и откройте окно New Query(Новый запрос).
Введите и выполните следующие инструкции, чтобы активировать уровень изоляции READ COMMITTED SNAPSHOT.
USE master;
ALTER DATABASE Ваша База_Данных
SET READ_COMMITTED_SNAPSHOT ON
3. Теперь запустим транзакцию и изменим Статус как в описанной выше процедуре (но оставим транзакцию открытой), выполнив следующий код:
USE Ваша База_Данных;
BEGIN TRAN
UPDATE Поставщики
SET Статус = 35
WHERE Код_Поставщика = ‘S1’;
4. Откройте еще одно окно запроса и выполните следующие инструкции для чтения данных из столбцов Имя_Поставщика и Статус строки Код_Поставщика= ‘S1’.
Возвращается Статус поставщика, поскольку это - самая последняя зафиксированная версия этой строки. В отличие от уровня READ COMMITED без параметра SNAPSHOT, запрос больше не блокируется.
Закройте окно запроса Query Window 2 и перейдите в окно запросаQuery Window 1.
Выполните следующие инструкции для отката транзакции и переключения обратно на уровень READ COMMITED (этот запрос будет ожидать, пока вы не закроете окно запроса Query Window 2).
ROLLBACK TRAN
GO
USE master;
ALTER DATABASE Ваша_База_Данных
SET READ_COMMITTED_SNAPSHOT OFF
Этот уровень изоляции можно использовать для уменьшения количества блокировок, но имейте в виду, что это — параметр уровня базы данных. Когда он изменяется, все транзакции, использующие уровень READ COMMITTED в этой базе данных, тоже изменяют свое поведение. Следовательно, такой прием можно рекомендовать использовать только в тех случаях, если все эти транзакции остаются логически правильными, когда считывают последнюю зафиксированную версию данных вместо актуальной зафиксированной версии данных.
Как добиться согласованных повторяющихся операций чтения
Один из недостатков уровня READ COMMITED заключается в том, что данные, считанные одной транзакцией, могут быть изменены другой транзакцией, пока выполняется первая транзакция. Следовательно, ни одна из версий уровня READ COMMITED мы не гарантируем согласованных чтений. Получение согласованных чтений означает, что в пределах одной транзакции всегда будут считываться одни и те же данные.
Уровень READ COMMITED использует разделяемые блокировки присчитывании данных, но снимает их после завершения операции чтения. Следовательно, другие транзакции могут изменять данные.
READ COMMITTED SNAPSHOT считывает последнюю зафиксированную версию данных. Когда данные считываются во второй раз, последняя зафиксированная версия может оказаться более свежей, чем предыдущая, если вторая транзакция зафиксировала изменение данных.
Несогласованность чтений может вызвать проблемы, если необходимы согласованные чтения, например, для создания отчета. Представьте себе, что транзакция вычисляет некоторые бизнес-показатели на основе ваших данных. В процессе выполнения этого вычисления с уровнем изоляции READ COMMITED существует возможность того, что эти значения будут вычислены неправильно, потому что базовые данные будут изменены, пока транзакция производит вычисления. Чтобы успешно выполнить расчет, можно использовать уровень изоляции SNAPSHOT. Этот уровень использует управление версиями, чтобы предоставить зафиксированную версию данных, но, в отличие от уровня READ COMMITED SNAPSHOT, он всегда предоставляет самую последнюю зафиксированную версию от начала транзакции. Следовательно, SQL Server всегда читает одни и те же данные на протяжении всей транзакции.
