Завершениетранзакции Если транзакция запущена – явно посредством команды
start
transac
tion
или неявно сервером БД, – пользователь должен явно завершить
ее, чтобы внесенные им изменения стали постоянными. Это делается
с помощью команды
commit
, которая указывает серверу пометить изме
нения как постоянные и высвободить все ресурсы (т. е. снять блоки
ровку страниц или строк), используемые во время транзакции.
Если решено отменить все изменения, сделанные с момента начала
транзакции, необходимо выполнить команду
rollback
, которая указы
вает серверу вернуть данные в то состояние, в каком они находились
до начала транзакции. После завершения выполнения
rollback
все ре
сурсы, используемые сеансом, высвобождаются.
Кроме выполнения команды
commit
или
rollback
, возможны еще не
сколько сценариев завершения транзакции – или как косвенный ре
зультат действий пользователя, или как результат чегото, находяще
гося вне власти пользователя:
• Выключение сервера; в этом случае откат транзакции будет выпол
нен автоматически при возобновлении работы сервера.
• Выполнение SQLвыражения управления схемой, например
alter
table
, что приведет к фиксации текущей транзакции и запуску но
вой.
• Выполнение еще одной команды
start
transaction
, в результате чего
происходит фиксация предыдущей транзакции.
• Преждевременное завершение транзакции сервером, который вы
явил
взаимоблокировку (
deadlock ) и решил, что виновна в этом дан
ная транзакция. В этом случае будет выполнен откат транзакции
и пользователь получит сообщение об ошибке.
Из этих четырех сценариев первый и третий довольно просты, а вот два
других заслуживают некоторого внимания. Если говорить о втором
сценарии, изменения базы данных, независимо от того, было ли это до
бавление новой таблицы, индексация или удаление столбца из табли
цы, не могут быть отменены. Таким образом, команды, изменяющие
схему, должны выполняться вне транзакции. Поэтому если транзак
ция уже запущена, сервер зафиксирует ее, выполнит команду(ы)
SQLвыражений управления схемой и затем автоматически запустит
новую транзакцию для данного сеанса. Сервер не будет информиро
вать пользователя о происходящем, поэтому следует действовать ак
куратно, чтобы выражения, составляющие единицу работы, невзна
чай не были разбросаны сервером по нескольким транзакциям.