COMMIT TRANSACTION (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис ДЛЯ SQL Server и База данных SQL Azure.

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Синтаксис для хранилища данных Synapse в Microsoft Fabric, Azure Synapse Analytics и базе данных параллельного хранилища данных.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

transaction_name

Область применения: SQL Server и База данных SQL Azure

Игнорируется ядро СУБД SQL Server. transaction_name указывает имя транзакции, назначенное предыдущимBEGIN TRANSACTION. Аргумент transaction_name должен соответствовать правилам для идентификаторов, но его длина не может превышать 32 символа. transaction_name указывает программистам, с которым BEGIN TRANSACTIONCOMMIT TRANSACTION связано вложение.

@tran_name_variable

Область применения: SQL Server и База данных SQL Azure

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

WITH DELAYED_DURABILITY = { OFF | ON }

Область применения: SQL Server и База данных SQL Azure

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

Замечания

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

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

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

COMMIT TRANSACTION@@TRANCOUNT При выполнении ноль приводит к ошибке; соответствующая BEGIN TRANSACTIONошибка отсутствует.

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

Ядро СУБД увеличивает число транзакций в операторе, только если число транзакций равно 0 в начале инструкции.

Разрешения

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

Примеры

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

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

Область применения: SQL Server, База данных SQL Azure, Azure Synapse Analytics и Analytics Platform System (PDW)

В следующем примере удаляется кандидат на вакансию.

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;

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

Область применения: SQL Server и База данных SQL Azure

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

IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
    DROP TABLE TestTran;
GO

CREATE TABLE TestTran (
    Cola INT PRIMARY KEY,
    Colb CHAR(3)
);
GO

-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;

PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (1, 'aaa');

-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;

PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (2, 'bbb');

-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;

PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (3, 'ccc');

-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;

PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;

PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;

PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));