COMMIT TRANSACTION (Transact-SQL)
适用于:Microsoft Fabric 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Warehouse
标志一个成功的隐性事务或显式事务的结束。 如果 @@TRANCOUNT
为 1, COMMIT TRANSACTION
则自事务开始以来进行所有数据修改是数据库的永久部分,释放事务的资源,并将数据减少 @@TRANCOUNT
到 0。 如果 @@TRANCOUNT
大于 1, COMMIT TRANSACTION
则仅减少 @@TRANCOUNT
1,事务保持活动状态。
语法
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 ]
[ ; ]
参数
transaction_name
适用对象:SQL Server 和 Azure SQL 数据库
SQL Server 数据库引擎忽略。 transaction_name指定上BEGIN TRANSACTION
一个分配的事务名称。 transaction_name 必须符合标识符规则,但不能超过 32 个字符。 transaction_name向嵌套与之BEGIN TRANSACTION
COMMIT 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 = DISABLED
DELAYED_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 时,数据库引擎才会增加语句内的事务计数。
权限
要求 公共 角色具有成员身份。
示例
本文中的 Transact-SQL 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 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 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));