Поделиться через


COMMIT TRANSACTION (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure хранилище платформы Аналитики Azure Synapse Analytics (PDW) в 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 TRANSACTION COMMIT 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 = DISABLED DELAYED_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.

Примеры

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества 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));