Управление транзакциями (компонент Database Engine)

Управление транзакциями в приложениях реализуется, главным образом, путем указания того, когда транзакция начинается и заканчивается. Это можно указать либо с помощью инструкций языка Transact-SQL, либо используя функции интерфейса прикладного программирования (API) для баз данных. В системе также должна быть возможность правильной обработки ошибок, прерывающих транзакцию до ее окончания.

По умолчанию управление транзакциями выполняется на уровне соединения. Когда транзакция начинает соединение, все выполняемые во время этого соединения инструкции языка Transact-SQL становятся частью транзакции до ее завершения. Однако в сеансе MARS явная или неявная транзакция языка Transact-SQL становится транзакцией контекста пакета, управляемой на пакетном уровне. После выполнения пакета, если транзакция контекста пакета не зафиксирована и не был выполнен ее откат, SQL Server производит автоматический откат такой транзакции.

Запуск транзакций

С помощью функций API и инструкций языка Transact-SQL можно запускать транзакции в экземпляре компонента SQL Server Database Engine как явные, автоматически фиксируемые или неявные транзакции. В сеансе MARS явные и неявные транзакции языка Transact-SQL становятся транзакциями контекста пакета.

  • Явные транзакции
    Явный запуск транзакции через функцию API или посредством инструкции языка Transact-SQL BEGIN TRANSACTION.

  • Автоматическая фиксация транзакций
    Режим по умолчанию для компонента Database Engine. Каждая отдельная инструкция языка Transact-SQL фиксируется после завершения. Нет необходимости указывать какие-либо инструкции для управления транзакциями.

  • Неявные транзакции
    Установка неявного режима транзакции либо через функцию API, либо через инструкцию языка Transact-SQL SET IMPLICIT_TRANSACTIONS ON. Следующая инструкция автоматически запускает новую транзакцию. После завершения этой транзакции следующая инструкция языка Transact-SQL запускает новую транзакцию.

  • Транзакции контекста пакета
    Применяемая только к наборам в режиме MARS явная или неявная транзакция языка Transact-SQL, которая запускается в сеансе MARS, становится транзакцией контекста пакета. SQL Server автоматически выполняет откат для транзакции контекста пакета, которая не фиксируется и откат которой не был выполнен после завершения пакета.

Управление режимами транзакций выполняется на уровне соединения. Если в одном соединении изменяется режим транзакций, это не влияет на режимы транзакций других соединений.

Завершение транзакций

Транзакции можно завершить инструкцией COMMIT или ROLLBACK, а также с помощью функции API.

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

  • ROLLBACK
    Если в транзакции произойдет ошибка или пользователь решит отменить транзакцию, следует выполнить ее откат. Инструкция ROLLBACK отменяет все изменения, сделанные в пределах транзакции, возвращая данные в то состояние, в котором они находились на начало транзакции. Инструкция ROLLBACK также освобождает удерживаемые транзакцией ресурсы.

ПримечаниеПримечание

Во время соединений, для которых включена поддержка режима MARS, невозможно зафиксировать явную транзакцию, начатую с помощью функции API, пока имеются запросы, ожидающие выполнения. Любая попытка зафиксировать этот тип транзакции при работающих необработанных операциях завершится ошибкой.

Указание границ транзакции

Можно идентифицировать время начала и окончания транзакций компонента Database Engine с помощью инструкций языка Transact-SQL либо функций и методов API.

  • Инструкции языка Transact-SQL
    Для описания транзакций используются инструкции BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK и SET IMPLICIT_TRANSACTIONS. Они в основном используются в приложениях DB-Library и в сценариях языка Transact-SQL, таких как сценарии, запускаемые с помощью программы командной строки osql.

  • Функции и методы API
    Интерфейсы прикладного программирования (API) баз данных, такие как ODBC, OLE DB, ADO и пространство имен .NET Framework SQLClient, содержат функции и методы, используемые для описания транзакций. Это основные механизмы управления транзакциями в приложении компонента Database Engine.

Каждая транзакция должна управляться только одним из этих методов. Использование обоих методов для одной транзакции может привести к непредсказуемым результатам. Например, не следует запускать транзакцию с помощью функций API ODBC, а затем использовать для ее фиксирования инструкцию языка Transact-SQL COMMIT. Это приведет к тому, что драйвер ODBC сервера SQL Server не будет уведомлен о фиксировании транзакции. В этом случае для завершения транзакции следует использовать функцию ODBC SQLEndTran.

Ошибки, возникающие в процессе обработки транзакций

Если ошибка делает невозможным успешное выполнение транзакции, SQL Server автоматически выполняет ее откат и освобождает ресурсы, удерживаемые транзакцией. Если сетевое соединение клиента с экземпляром компонента Database Engine разорвано, то после того, как экземпляр получит уведомление от сети о разрыве соединения, выполняется откат всех необработанных транзакций для этого соединения. В случае сбоя клиентского приложения, выключения либо перезапуска клиентского компьютера соединение также будет разорвано, а экземпляр компонента Database Engine выполнит откат всех необработанных транзакций после получения уведомления о разрыве от сети. Если клиент выйдет из приложения, выполняется откат всех необработанных транзакций.

В случае ошибки во время выполнения инструкции (нарушения ограничения) в пакете, по умолчанию компонент Database Engine выполнит откат только той инструкции, которая привела к ошибке. Это поведение можно изменить с помощью инструкции SET XACT_ABORT. После выполнения инструкции SET XACT_ABORT ON любая ошибка во время выполнения инструкции приведет к автоматическому откату текущей транзакции. Инструкция SET XACT_ABORT не влияет на компиляцию ошибок, синтаксических. Дополнительные сведения см. в разделе SET XACT_ABORT (Transact-SQL).

На случай возникновения ошибок код приложения должен содержать исправляющее действие: COMMIT или ROLLBACK. Эффективным средством для обработки ошибок, включая ошибки транзакций, является конструкция языка Transact-SQL TRY...CATCH. Дополнительные сведения с примерами, включающими транзакции, см. в разделах Использование конструкции TRY...CATCH в языке Transact-SQL и TRY...CATCH (Transact-SQL).