Существует шесть операторов Transact-SQL, связанных с транзакциями:
♦ begin transaction;
♦ begin distributed transaction;
♦ commit [work];
♦ rollback [work];
♦ save transaction;
♦ set implicit_transactions.
Оператор begin transaction запускает транзакцию. Он имеет следующий синтаксис:
begin transaction [{transaction_name I Qtrans_var} [with mark ['description'] } ]
Здесь transaction_name- имя, назначаемое транзакции. Оно может быть использовано только в самой внешней паре вложенных операторов begin transaction/commit или begin transaction/rollback. Qtrans_yar- имя определенной пользователем переменной, содержащей допустимое имя транзакции. Опция with mark указывает, что транзакция должна быть отмеченной в протоколе транзакций, description является строкой, которая описывает эту отметку. Если используется with mark, то имя транзакции обязательно должно быть указано. (Более подробную информацию о протоколе транзакций и об отметках для восстановления.)
Оператор begin distributed transaction задает старт распределенной транзакции, которая управляется Microsoft Distributed Transaction Coordinator (MS DTC, координатор распределенных транзакций Microsoft). Распределенная транзакция - это транзакция, которая использует базы данных более чем на одном сервере. Сервер, выполняющий оператор begin distributed transaction, является координатором транзакции и поэтому управляет завершением распределенной транзакции. (Обсуждение распределенных транзакций.)
Оператор commit work успешно завершает транзакцию, запущенную оператором begin transaction. Это означает, что все изменения, выполненные в этой транзакции, сохраняются на диске. Оператор commit work является стандартизованным оператором SQL. (Предложение work является необязательным.)
В противоположность оператору commit оператор rollback work сообщает о неуспешном завершении транзакции. Программисты используют этот оператор, когда они предполагают, что база данных может оказаться в несогласованном состоянии. В этом случае все выполненные операции по модификации данных внутри транзакции отменяются. Оператор rollback work является стандартизованным оператором SQL. (Предложение work является необязательным.)
Оператор save transaction устанавливает точку сохранения транзакции. Точка сохранения отмечает заданную точку в транзакции, в этом случае все последующие изменения данных могут быть отменены без отмены действий всей транзакции. Для отмены всей транзакции используйте оператор rollback.
В примере 13.2 показано использование оператора save transaction.
В примере 13.2 будет выполнен только лишь первый оператор insert. Для третьего оператора insert будет выполнен откат в операторе rollback transaction ь, а для двух других операторов insert будет выполнена отмена оператором rollback transaction а.
Как вы уже знаете, каждый оператор Transact-SQL всегда явно или неявно принадлежит транзакции. Database Engine предоставляет неявные транзакции для совместимости со стандартом SQL. Когда сессия работает в режиме неявных транзакций, выполняемые операторы неявно выдают оператор begin transaction. Это означает, что вам ничего не нужно делать для старта неявных транзакций. Тем не менее, завершение каждой неявной транзакции должно быть явно подтверждено или отменено при использовании оператора commit или rollback. Если вы явно не подтвердите транзакцию, то транзакция и все данные, измененные в ней, будут отменены, когда пользователь отсоединится от базы данных.
Для возможности использования неявных транзакций вы должны установить разрешающее значение в предложении implicitjtransaction оператора set. Этот оператор устанавливает режим неявных транзакций в текущей сессии. Когда выполняется соединение в режиме неявных транзакций и это соединение не находится в данный момент в рамках транзакции, то выполнение любого из следующих операторов запускает на выполнение транзакцию:
♦ alter table; ♦ revoke;
♦ fetch; ♦ create table;
♦ grant; ♦ truncate table;
♦ select; ♦ drop table;
♦ delete; ♦ open;
♦ insert; ♦ update.
Иными словами, если у вас есть последовательность операторов из предыдущего списка, то каждый оператор будет представлять одну транзакцию.
Начало явно объявленной транзакции отмечается оператором begin transaction. Завершение явно объявленной транзакции отмечается операторами commit или rollback. Явные транзакции могут быть вложенными. В этом случае каждая пара операторов begin transaction/commit или begin transaction/rollback используется внутри одной или большего количества таких пар. (Вложенные транзакции обычно применяются в хранимых процедурах, которые сами используют транзакции и внутри себя вызывают другие транзакции.) Глобальная переменная @@trancount содержит количество активных транзакций для текущего пользователя.
Операторы begin transaction, commit и rollback могут использоваться с именем заданной транзакции. (Имя в операторе rollback может соответствовать либо именованной транзакции, либо оператору save transaction с тем же именем.) Вы можете использовать именованные транзакции только в самой внешней паре вложенных операторов begin transaction/commit или begin transaction/rollback.