Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab 6.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
60 Кб
Скачать
☆

Особые сценарии rollback

Если транзакции вложены благодаря наличию в сеансе множественных инструкций BEGIN TRANSACTION, инструкция ROLLBACK выполняет откат для самой внешней из вложенных транзакций. Это справедливо даже если перед командой ROLLBACK, относящейся к внешней транзакции, встречаются инструкции COMMIT для транзакций на более низких уровнях вложенности. В следующем примере выполняется откат данных вплоть до транзакции, запущенной в строке 1, и вставляемая строка полностью удаляется из таблицы.

  1. BEGIN TRANSACTION

  2. INSERT INTO Employee

  3. VALUES (“Новое имя”, “Должность”);

  4. BEGIN TRANSACTION

  5. UPDATE Buyer

  6. SET Name = “Егоров Анатолий Васильевич”

  7. WHERE BuyerID = 26;

  8. COMMIT TRANSACTION;

  9. ROLLBACK;

Если вы хотите выполнить откат только части транзакции, можно задать точки сохранения с помощью инструкции SAVE TRANSACTION savepoint_name и затем сослаться на имя точки сохранения в инструкции ROLLBACK. Делая это, вы сообщаете Database Engine об отмене изменений только до точки, в которой вы привели инструкцию SAVE TRANSACTION с тем же именем.

Если задается несколько точек сохранения с одним и тем же именем, инструкция ROLLBACK выполняет откат до самой последней инструкции ROLLBACK. Если вы хотите отменить транзакцию целиком, введите инструкцию ROLLBACK TRANSACTION с именем транзакции или вообще без имени. Помните о том, что использование инструкций ROLLBACK TRANSACTION без имени приводит к откату всех вложенных транзакций [1].

Установка уровней изоляции

С помощью инструкции SET TRANSACTION ISOLATION LEVEL можно установить следующие уровни изоляции транзакции.

READ UNCOMMITTED – разрешает инструкциям читать строки, обновленные любой транзакцией и еще не зафиксированные в базе данных Этот уровень изоляции минимизирует вероятность конфликтов, но допускает «грязные» считывания (dirty reads) и неповторимые считывания.

READ COMMITTED – разрешает инструкциям в текущих соединениях и транзакциях производить неповторимые считывания, но запрещает «грязные» считывания (данные, обновленные транзакцией, открытой в другом соединении). Это уровень изоляции, принятый по умолчанию в SQL Server.

REPEATABLE READ – не разрешает транзакциям считывать незафиксированные измененные данные («грязные» считывания) и гарантирует сохранение совмещаемых блокировок до завершения текущей транзакции.

SNAPSHOT – требует, чтобы параметр базы данных ALLOW_SNAPSHOT_ISOLATION был равен значению ON. Этот уровень изоляции формирует моментальный снимок данных в момент их считывания в транзакцию, но не поддерживает блокировку данных. Могут выполнятся обновления из другой транзакции, но текущая транзакция не видит этих изменений, отраженных в последующих считываниях исходных данных. Если текущая транзакция модифицирует данные, эти модификации видны только в текущей транзакции.

SERIALIZABLE – не разрешает считывать данные, которые были обновлены, но не зафиксированы другими транзакциями. Кроме того, никакая другая транзакция не может до завершения текущей транзакции обновлять данные, которые были считаны текущей транзакцией. Уровень изоляции SERIALIZABLE защищает от фантомных считываний, но создает наивысший уровень конкуренции и блокирования [1].

Синтаксическая запись команды определения уровня изоляции транзакции:

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SNAPSHOT

| SERIALIZABL

}

После того как в сеансе выполнена инструкция SET TRANSACTION ISOLATION LEVEL, все транзакции в пределах этого соединения используют заданный уровень изоляции [1].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]