- •Теоретический материал
- •Определение явных транзакций
- •Особые сценарии rollback
- •Установка уровней изоляции
- •Функции ident_current, scope_identity, @@identity
- •Ident_current возвращает последнее значение идентифицирующего столбца, созданное для конкретной таблицы в любом сеансе и области поиска.
- •Содержание работы
Особые сценарии rollback
Если транзакции вложены благодаря наличию в сеансе множественных инструкций BEGIN TRANSACTION, инструкция ROLLBACK выполняет откат для самой внешней из вложенных транзакций. Это справедливо даже если перед командой ROLLBACK, относящейся к внешней транзакции, встречаются инструкции COMMIT для транзакций на более низких уровнях вложенности. В следующем примере выполняется откат данных вплоть до транзакции, запущенной в строке 1, и вставляемая строка полностью удаляется из таблицы.
BEGIN TRANSACTION
INSERT INTO Employee
VALUES (“Новое имя”, “Должность”);
BEGIN TRANSACTION
UPDATE Buyer
SET Name = “Егоров Анатолий Васильевич”
WHERE BuyerID = 26;
COMMIT TRANSACTION;
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].
