COMMIT TRANSACTION (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的仓库

标志一个成功的隐性事务或显式事务的结束。 如果 @@TRANCOUNT 为 1, COMMIT TRANSACTION 则自事务开始以来进行所有数据修改是数据库的永久部分,释放事务的资源,并将数据减少 @@TRANCOUNT 到 0。 如果 @@TRANCOUNT 大于 1, COMMIT TRANSACTION 则仅减少 @@TRANCOUNT 1,事务保持活动状态。

Transact-SQL 语法约定

语法

SQL Server 和 Azure SQL 数据库 的语法。

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

Microsoft Fabric、Azure Synapse Analytics 和并行数据仓库数据库中 Synapse 数据仓库的语法。

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

transaction_name

适用对象:SQL Server 和 Azure SQL 数据库

SQL Server 数据库引擎忽略。 transaction_name指定上BEGIN TRANSACTION一个分配的事务名称。 transaction_name 必须符合标识符规则,但不能超过 32 个字符。 transaction_name向嵌套与之BEGIN TRANSACTIONCOMMIT TRANSACTION关联的程序员指示。

@tran_name_variable

适用对象:SQL Server 和 Azure SQL 数据库

包含有效事务名称的用户定义变量的名称。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量 。 如果将超过 32 个字符传递给变量,则仅使用 32 个字符。 其余字符将被截断。

WITH DELAYED_DURABILITY = { OFF |ON }

适用对象:SQL Server 和 Azure SQL 数据库

请求应将此事务与延迟持续性一起提交的选项。 如果数据库被更改或DELAYED_DURABILITY = DISABLEDDELAYED_DURABILITY = FORCED更改,则忽略该请求。 有关详细信息,请参阅控制事务持续性

注解

仅当事务引用的所有数据在逻辑上正确时,Transact-SQL 程序员才负责颁发 COMMIT TRANSACTION

如果提交的事务是 Transact-SQL 分布式事务, COMMIT TRANSACTION 则触发 MS DTC 使用两阶段提交协议提交事务涉及的所有服务器。 如果本地事务跨越同一 数据库引擎 实例上的两个或多个数据库,则该实例将使用内部的两阶段提交来提交所有涉及该事务的数据库。

如果用于嵌套事务,内部事务的提交并不释放资源,也不使其修改成为永久修改。 只有在提交了外部事务时,数据修改才具有永久性,而且资源才会被释放。 每个 COMMIT TRANSACTION 颁发时间 @@TRANCOUNT 大于一个只是递减 @@TRANCOUNT 1。 当 @@TRANCOUNT 最终递减到 0 时,将提交整个外部事务。 由于transaction_name被数据库引擎忽略,因此当存在未完成的内部事务仅减少 @@TRANCOUNT 1 时,发出COMMIT TRANSACTION引用外部事务的名称。

COMMIT TRANSACTION如果为零,则发出错误@@TRANCOUNT;没有相应的BEGIN TRANSACTION错误。

在发出语句后 COMMIT TRANSACTION ,无法回滚事务,因为数据修改是数据库的永久部分。

仅当事务计数在语句开始处为 0 时,数据库引擎才会增加语句内的事务计数。

权限

要求 公共 角色具有成员身份。

示例

本文需要 AdventureWorks2022 示例数据库,其可从 Microsoft SQL Server 示例和社区项目主页下载。

A. 提交事务

适用对象:SQL Server、Azure SQL 数据库、Azure Synapse Analytics 和 Analytics Platform System (PDW)

以下示例删除候选作业。

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

B. 提交嵌套事务

适用对象:SQL Server 和 Azure SQL 数据库

下面的示例创建一个表,生成三个级别的嵌套事务,然后提交该嵌套事务。 虽然每个 COMMIT TRANSACTION 语句都具有一个 transaction_name 参数,但 COMMIT TRANSACTIONBEGIN 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));