Управление транзакциями. Последовательность операций, которая по вашему указанию интерпретируется как единое целое

Страницы работы

Фрагмент текста работы

Транзакция – это последовательность операций, которая по вашему указанию интерпретируется как единое целое. Либо все операции транзакции выполняются успешно, либо транзакция отменяется.

По умолчанию в SQL Server каждая инструкция INSERT, UPDATE или DELETE – это отдельная транзакция, которая фиксируется автоматически и не предоставляет возможность отката. Но транзакцию можно явно объявить, включив в нее произвольное количество команд.

BEGIN TRANSACTION отмечает начальную точку явной транзакции.  

BEGIN { TRAN|TRANSACTION }[ transaction_name [ WITH MARK ] ] [ ; ]

transaction_name 

Имя, присвоенное транзакции. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако не допускаются идентификаторы длиннее 32 символов. Имена транзакций используются только для самых внешних вложенных инструкций BEGIN...COMMIT или BEGIN...ROLLBACK.

WITH MARK 

Указывает, что транзакция отмечается в журнале. Предложение WITH MARK позволяет восстановить журнал транзакций до именованной отметки.

v  Инструкция увеличивает значение функции @@TRANCOUNT на 1.

v  Инструкция BEGIN TRANSACTION предоставляет точку, где гарантируется логическая и физическая согласованность данных, на которые ссылается соединение. В случае ошибок для всех изменений после BEGIN TRANSACTION можно выполнить откат, чтобы вернуть данные к известному согласованному состоянию. 

v  Присвоение имен нескольким транзакциям в последовательности вложенных транзакций мало влияет на транзакцию. Системой регистрируется только первое (самое внешнее) имя транзакции. Откат к другому имени приводит к формированию ошибки. 

Каждая транзакция продолжается до тех пор, пока она не завершается без ошибок и выполняется инструкция COMMIT TRANSACTION, чтобы внести изменения в базу данных. 

COMMIT TRANSACTION отмечает успешное завершение транзакции. 

COMMIT { TRAN | TRANSACTION } [ transaction_name ] [ ; ]

Обязанностью программиста на языке Transact-SQL является вызов инструкции COMMIT

TRANSACTION только в том случае, когда все данные, относящиеся к транзакции, логически верны.

v  Если значение параметра @@TRANCOUNT равно 1, то инструкция COMMIT TRANSACTION делает все изменения, выполненные с начала транзакции, освобождает ресурсы, удерживаемые транзакцией, и уменьшает значение параметра @@TRANCOUNT до 0. 

v  Если значение параметра @@TRANCOUNT больше 1, инструкция COMMIT TRANSACTION уменьшает значение параметра @@TRANCOUNT на 1 и оставляет транзакцию активной. 

v  При использовании вложенных транзакций фиксация внутренних транзакций не освобождает ресурсы и не делает их изменения постоянными. Вызов каждой инструкции COMMIT TRANSACTION приводит к тому, что если значение параметра @@TRANCOUNT больше 1, то значение параметра @@TRANCOUNT просто уменьшается на 1. Когда значение параметра @@TRANCOUNT уменьшится до нуля, вся внешняя транзакция фиксируется. 

v  Так как аргумент transaction_name не учитывается компонентом Database Engine, то вызов инструкции COMMIT TRANSACTION, содержащей ссылку на имя внешней транзакции, приводит к тому, что если существуют необработанные внутренние транзакции, то производится только уменьшение значения параметра @@TRANCOUNT на 1.

v  Вызов инструкции COMMIT TRANSACTION, когда значение параметра @@TRANCOUNT равно нулю, дает ошибку, так как нет соответствующей инструкции BEGIN TRANSACTION.

Нельзя произвести откат транзакции после вызова инструкции COMMIT TRANSACTION, так как измененные данные уже стали частью базы данных.

В случае возникновения ошибок все изменения удаляются с помощью инструкции ROLLBACK TRANSACTION. ROLLBACK TRANSACTION откатывает явные или неявные транзакции до начала или до точки сохранения транзакции.

ROLLBACK { TRAN|TRANSACTION }[ transaction_name | savepoint_name][ ; ]

savepoint_name 

Параметр savepoint_name  используется, если откат по условию должен

Похожие материалы

Информация о работе