Создание транзакций и управление ими
Чтобы явно начать транзакцию, используйте команду BEGIN TRANSACTION или её сокращённую версию BEGIN TRAN.
После запуска транзакции его необходимо завершить следующим образом:
- COMMIT TRANSACTION или
- ОТМЕНА ТРАНЗАКЦИИ.
Это гарантирует, что все операции в транзакции фиксируются вместе или откатываются в случае ошибки.
Транзакции продолжаются до тех пор, пока не будет выдана команда COMMIT TRANSACTION или ROLLBACK TRANSACTION, или подключение будет удалено. Если подключение теряется во время выполнения транзакции, выполняется откат всей транзакции.
Транзакции могут быть вложенными, при этом внутренние транзакции будут отменены, если внешняя транзакция откатывается.
Ошибка не обнаружена
Когда инструкции в транзакции завершены без ошибок, используйте COMMIT TRANSACTION, иногда сокращено до COMMIT TRAN. Это фиксирует изменения в базе данных. Это также приведет к освобождению ресурсов, таких как блокировки, удерживаемые во время транзакции.
Если обнаружена ошибка
Если в транзакции произошла ошибка, используйте команду ROLLBACK.
ROLLBACK отменяет любые изменения, внесенные в данные во время транзакции, оставляя его в состоянии, которое было до начала транзакции. ROLLBACK также освобождает ресурсы, например, блокировки, удерживаемые в ходе транзакции.
XACT_ABORT (автоматическое завершение транзакции при ошибке)
Если параметр SET XACT_ABORT включен, если SQL Server вызывает ошибку, выполняется откат всей транзакции. Если параметру SET XACT_ABORT присвоено значение OFF, происходит откат только той инструкции, которая вызвала ошибку, если серьезность ошибки является низкой.
Например, если параметр SET XACT_ABORT имеет значение OFF, транзакция имеет три инструкции. Две не имеют ошибок, но третья из них нарушает ограничение проверки. В этом примере, несмотря на то, что три оператора находятся в транзакции, два из них зафиксированы. В том же примере, если ошибка была вызвана неправильным типом данных, это было бы достаточно серьезно, чтобы выполнить откат, и ни одна из инструкций не будет зафиксирована.
Поскольку не всегда ясно, будет ли транзакция зафиксирована или откатена, важно добавить обработку ошибок в транзакции.