Транзакция – это последовательность операций, которая по вашему указанию интерпретируется как единое целое. Либо все операции транзакции выполняются успешно, либо транзакция отменяется.
По умолчанию в SQL Server каждая инструкция INSERT, UPDATE или DELETE – это отдельная транзакция, которая фиксируется автоматически и не предоставляет возможность отката. Но транзакцию можно явно объявить, включив в нее произвольное количество команд.
BEGIN TRANSACTION отмечает начальную точку явной транзакции.
BEGIN { TRAN|TRANSACTION }[ transaction_name [ WITH MARK ] ] [ ; ]
Имя, присвоенное транзакции. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако не допускаются идентификаторы длиннее 32 символов. Имена транзакций используются только для самых внешних вложенных инструкций BEGIN...COMMIT или BEGIN...ROLLBACK.
Указывает, что транзакция отмечается в журнале. Предложение 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 используется, если откат по условию должен
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.