Transact-SQL 参考

COMMIT TRANSACTION

标志一个成功的隐性事务或用户定义事务的结束。如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放连接占用的资源,并将 @@TRANCOUNT 减少到 0。如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减。

语法

COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]

参数

transaction_name

Microsoft® SQL Server™ 忽略该参数。transaction_name 指定由前面的 BEGIN TRANSACTION 指派的事务名称。transaction_name 必须遵循标识符的规则,但只使用事务名称的前 32 个字符。通过向程序员指明 COMMIT TRANSACTION 与哪些嵌套的 BEGIN TRANSACTION 相关联,transaction_name 可作为帮助阅读的一种方法。

@tran_name_variable

是用户定义的、含有有效事务名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明该变量。

注释

只有当事务所引用的所有数据的逻辑都正确时,发出 COMMIT TRANSACTION 命令才是一个 Transact-SQL 程序员的职责。

如果所提交的事务是 Transact-SQL 分布式事务,COMMIT TRANSACTION 将触发 MS DTC 使用两阶段提交协议,以便提交所有涉及该事务的服务器。如果局部事务跨越同一服务器上的两个或多个数据库,那么 SQL Server 将使用内部的两阶段提交来提交所有涉及该事务的数据库。

当在嵌套事务中使用时,内部事务的提交并不释放资源或使其修改成为永久修改。只有在提交了外部事务时,数据修改才具有永久性,而且资源才会被释放。当 @@TRANCOUNT 大于 1 时,每发出一个 COMMIT TRANSACTION 命令就会使 @@TRANCOUNT 按 1 递减。当 @@TRANCOUNT 最终减少到 0 时,将提交整个外部事务。因为 transaction_name 被 SQL Server 忽略,所以当存在仅将 @@TRANCOUNT 按 1 递减的显著内部事务时,发出一个引用外部事务名称的 COMMIT TRANSACTION。

当 @@TRANCOUNT 为 0 时发出 COMMIT TRANSACTION 将会导致出现错误,因为没有相应的 BEGIN TRANSACTION。

不能在发出一个 COMMIT TRANSACTION 语句之后回滚事务,因为数据修改已经成为数据库的一个永久部分。

示例
A. 提交事务。

下面的示例在图书的截止当前销售额超过 $8,000 时,增加支付给作者的预付款。

BEGIN TRANSACTION
USE pubs
GO
UPDATE titles
SET advance = advance * 1.25
WHERE ytd_sales > 8000
GO
COMMIT
GO
B. 提交嵌套事务。

下面的示例创建一个表,生成三个级别的嵌套事务,然后提交该嵌套事务。尽管每个 COMMIT TRANSACTION 语句都有一个 transaction_name 参数,但是 COMMIT TRANSACTION 和 BEGIN TRANSACTION 语句之间没有任何关系。transaction_name 参数仅是帮助阅读的方法,可帮助程序员确保提交的正确号码被编码以便将 @@TRANCOUNT 减少到 0,然后提交外部事务。

CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1.
GO
INSERT INTO TestTran VALUES (1, 'aaa')
GO
BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2.
GO
INSERT INTO TestTran VALUES (2, 'bbb')
GO
BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3.
GO
INSERT INTO TestTran VALUES (3, 'ccc')
GO
COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2.
-- Nothing committed.
GO
COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1.
-- Nothing committed.
GO
COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0.
-- Commits outer transaction OuterTran.
GO

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT WORK

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

@@TRANCOUNT

事务