1c запрос commit transaction не имеет соответствующей инструкции begin transaction

Обновлено: 07.07.2024

Отмечает успешное завершение явной или неявной транзакции. Если значение @@TRANCOUNT равно 1, то инструкция COMMIT TRANSACTION делает все изменения, произведенные с начала транзакции, постоянной частью базы данных, освобождает ресурсы транзакции и уменьшает значение параметра @@TRANCOUNT до 0. Если значение @@TRANCOUNT больше 1, инструкция COMMIT TRANSACTION уменьшает значение @@TRANCOUNT только на 1 и оставляет транзакцию активной.

Синтаксис

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

transaction_name
ПРИМЕНИМО К: SQL Server и база данных SQL Azure

Не учитывается компонентом Компонент SQL Server Database Engine. transaction_name указывает имя транзакции, присвоенное предыдущей инструкцией BEGIN TRANSACTION. Аргумент transaction_name должен соответствовать правилам для идентификаторов, но его длина не может превышать 32 символа. transaction_name сообщает программистам, с какой вложенной инструкцией BEGIN TRANSACTION связана инструкция COMMIT TRANSACTION.

@tran_name_variable
ПРИМЕНИМО К: SQL Server и база данных SQL Azure

Имя определенной пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если переменной присваивается значение длиной более 32 символов, используются только первые 32, остальные усекаются.

DELAYED_DURABILITY
ПРИМЕНИМО К: SQL Server и база данных SQL Azure

Параметр, который запрашивает эту транзакцию, должен фиксироваться с задержанной устойчивостью. Этот запрос пропускается, если база данных была изменена с использованием DELAYED_DURABILITY = DISABLED или DELAYED_DURABILITY = FORCED . Дополнительные сведения см. в разделе Управление устойчивостью транзакций.

Remarks

Обязанностью программиста на языке Transact-SQL является вызов инструкции COMMIT TRANSACTION только в том случае, когда все данные, относящиеся к транзакции, логически верны.

Если зафиксированная транзакция является распределенной транзакцией Transact-SQL, инструкция COMMIT TRANSACTION вызывает координатор MS DTC для использования двухфазного протокола фиксации на всех серверах, участвующих в транзакции. Если локальная транзакция охватывает две или более базы данных одного и того же экземпляра компонента Компонент Database Engine, то экземпляр использует встроенную двухфазную фиксацию для всех баз данных, вызванных в транзакции.

При использовании вложенных транзакций фиксация внутренних транзакций не освобождает ресурсы и не делает их изменения постоянными. Изменения данных становятся постоянными и ресурсы освобождаются только при фиксации внешней транзакции. Вызов каждой инструкции COMMIT TRANSACTION приводит к тому, что если значение @@TRANCOUNT больше 1, то значение переменной @@TRANCOUNT просто уменьшается на 1. Когда значение @@TRANCOUNT уменьшится до нуля, вся внешняя транзакция фиксируется. Так как аргумент transaction_name не учитывается компонентом Компонент Database Engine, вызов инструкции COMMIT TRANSACTION, содержащей ссылку на имя внешней транзакции, приводит к тому, что если существуют необработанные внутренние транзакции, то значение @@TRANCOUNT уменьшается только на 1.

Вызов инструкции COMMIT TRANSACTION, когда значение параметра @@TRANCOUNT равно нулю, приводит к ошибке, так как нет соответствующей инструкции BEGIN TRANSACTION.

Нельзя произвести откат транзакции после вызова инструкции COMMIT TRANSACTION, так как измененные данные уже стали частью базы данных.

Компонент Database Engine увеличивает счетчик транзакций внутри выражения, только когда счетчик транзакций равен нулю при запуске инструкции.

Разрешения

Необходимо быть членом роли public.

Примеры

A. Фиксация транзакции

ПРИМЕНИМО К: SQL Server, База данных SQL Azure, Azure Synapse Analytics и Система платформы аналитики (PDW)

В следующем примере удаляется кандидат на вакансию. В нем используется база данных AdventureWorks.

Б. Фиксация вложенной транзакции

ПРИМЕНИМО К: SQL Server и база данных SQL Azure

В следующем примере создается таблица и формируется три уровня вложенных транзакций, которые затем фиксируются. Хотя каждая инструкция COMMIT TRANSACTION имеет параметр transaction_name, связи между инструкциями COMMIT TRANSACTION и BEGIN TRANSACTION не существует. Параметры transaction_name позволяют программисту удостовериться в том, что закодировано правильное количество фиксаций, необходимое для того, чтобы уменьшить значение @@TRANCOUNT до 0 и таким образом зафиксировать внешнюю транзакцию.

Читайте также: