Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 УправлениеТранзакциями.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
80.9 Кб
Скачать

Применяем уровень изоляции read commited snapshot

  1. Запустите SQL Server Management Studio и откройте окно New Query(Новый запрос).

  2. Введите и выполните следующие инструкции, чтобы активировать уровень изоляции 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, запрос больше не блокируется.

  1. Закройте окно запроса Query Window 2 и перейдите в окно запросаQuery Window 1.

  2. Выполните следующие инструкции для отката транзакции и переключения обратно на уровень 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 всегда читает одни и те же данные на протяжении всей транзакции.