ЗАКЛЮЧИТЬ ТРАНЗАКЦИЮ (Transact-SQL)

Относится к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsХранилище данных в Microsoft FabricБаза данных SQL в Microsoft Fabric

Отмечает успешное завершение явной или неявной транзакции.

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

Если @@TRANCOUNT значение больше 1, уменьшение COMMIT TRANSACTION на 1, @@TRANCOUNT а транзакция остается активной.

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

Syntax

Синтаксис ДЛЯ SQL Server, Базы данных SQL Azure, Управляемого экземпляра SQL Azure, базы данных SQL в Microsoft Fabric.

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

Синтаксис для Fabric Data Warehouse и Azure Synapse Analytics.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Arguments

transaction_name

Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.

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

@tran_name_variable

Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.

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

С DELAYED_DURABILITY = { OFF | ON }

Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.

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

Дополнительные сведения см. в разделе Управление устойчивостью транзакций.

Remarks

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

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

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

При выполнении нулевого COMMIT TRANSACTION@@TRANCOUNT значения ошибка возникает из-за отсутствия соответствующего BEGIN TRANSACTIONзначения.

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

Замечание

Ядро СУБД не поддерживает независимо управляемые вложенные транзакции. Фиксация внутренних транзакций уменьшается @@TRANCOUNT , но не имеет других последствий. Откат внутренней транзакции всегда откатывает внешнюю транзакцию, если точка сохранения не существует и не указана в инструкции ROLLBACK .

Permissions

Необходимо членство в роли public.

Examples

Примеры кода в этой статье используют AdventureWorks2025 базу данных ORAdventureWorksDW2025, которую можно скачать из репозитория GitHub Azure Data Samples SQL Repository

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

Применяется к: SQL Server, Azure SQL SQL Database, Azure SQL SQL Managed Instance, SQL database in Microsoft Fabric, Azure Synapse Analytics

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

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

B. Фиксация внешней транзакции и внутренних транзакций

Область применения: SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.

В следующем примере создается таблица, запускается внешняя и две внутренние транзакции, а затем фиксируется каждая транзакция. Параметры 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));