ROLLBACK TRANSACTION (Transact-SQL)

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

此语句将显式或隐式事务回滚到事务的开头,或回滚到事务内的保存点。 可用于 ROLLBACK TRANSACTION 清除从事务开始或保存到保存点进行的所有数据修改。 它还释放由事务控制的资源。

回滚事务不包括对局部变量或表变量所做的更改。 此语句不会清除这些更改。

Transact-SQL 语法约定

语法

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

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

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

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

注意

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

参数

transaction_name

分配给事务 BEGIN TRANSACTION的名称。 transaction_name 必须符合标识符规则,但只使用事务名称的前 32 个字符。 嵌套事务时, transaction_name 必须是最 BEGIN TRANSACTION 外部语句的名称。 即使 SQL Server 实例不区分大小写,transaction_name也始终区分大小写。

@tran_name_variable

包含有效事务名称的用户定义变量的名称。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量 。

savepoint_name

SAVE TRANSACTION语句savepoint_name。 savepoint_name 必须遵守标识符规则。 当条件回滚应只影响事务的一部分时,可使用 savepoint_name

@savepoint_variable

包含有效保存点名称的用户定义变量的名称。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量 。

错误处理

语句 ROLLBACK TRANSACTION 不会向用户生成任何消息。 如果在存储过程或触发器中需要警告,请使用 RAISERRORPRINT 语句。 RAISERROR 是用于指示错误的首选语句。

注解

ROLLBACK TRANSACTION没有savepoint_nametransaction_name回滚到事务的开头。 嵌套事务时,同一语句会将所有内部事务回滚到最 BEGIN TRANSACTION 外部的语句。 在这两种情况下, ROLLBACK TRANSACTION 系统函数将减少 @@TRANCOUNT 到 0。 ROLLBACK TRANSACTION <savepoint_name> 不会递减 @@TRANCOUNT

ROLLBACK TRANSACTION无法在分布式事务中引用以显式BEGIN DISTRIBUTED TRANSACTION方式启动或从本地事务升级的savepoint_name

执行语句后 COMMIT TRANSACTION ,无法回滚事务,除非与 COMMIT TRANSACTION 正在回滚的事务中包含的嵌套事务相关联。 在此实例中,即使已为其发出 COMMIT TRANSACTION 嵌套事务,也会回滚该事务。

在事务中,允许重复保存点名称,但 ROLLBACK TRANSACTION 使用重复保存点名称仅回滚到使用该保存点名称的最新 SAVE TRANSACTION 保存点名称。

互操作性

在存储过程中, ROLLBACK TRANSACTION带savepoint_nametransaction_name 的语句将所有语句回滚到最外层 BEGIN TRANSACTIONROLLBACK TRANSACTION存储过程中的语句,当存储过程完成@@TRANCOUNT时导致@@TRANCOUNT具有不同于调用存储过程时的值生成信息性消息的语句。 此消息不会影响后续处理。

如果在触发器中颁发了 a ROLLBACK TRANSACTION

  • 将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。

  • 触发器继续执行语句后 ROLLBACK 的任何剩余语句。 如果这些语句中的任意语句修改数据,则不回退这些修改。 执行其余的语句不会激发嵌套触发器。

  • 不会执行触发触发器的语句之后批处理中的语句。

@@TRANCOUNT 在进入触发器时,即使处于自动提交模式,也会递增一个。 (系统将触发器视为隐含的嵌套事务处理。)

ROLLBACK TRANSACTION 存储过程中的语句不会影响调用该过程的批处理中的后续语句;将执行批处理中的后续语句。 ROLLBACK TRANSACTION 触发器中的语句终止包含触发触发器的语句的批处理;不会执行批处理中的后续语句。

游标的效果 ROLLBACK 由以下三个规则定义:

  • 使用 CURSOR_CLOSE_ON_COMMIT set ONROLLBACK 关闭但不释放所有打开的游标。

  • OFF设置CURSOR_CLOSE_ON_COMMIT后,ROLLBACK不会影响任何已完全填充的打开同步STATICINSENSITIVE游标或异步STATIC游标。 将关闭但不释放任何其他类型的打开的游标。

  • 终止批处理并生成内部回滚的错误将释放在包含错误声明的批处理中声明的所有游标。 无论游标的类型或设置 CURSOR_CLOSE_ON_COMMIT如何,所有游标都会解除分配。 这包括在错误批处理调用的存储过程中声明的游标。 在错误批处理之前在批处理中声明的游标受前两个规则的约束。 死锁错误便是此类错误的一个示例。 ROLLBACK触发器中颁发的语句也会自动生成这种类型的错误。

锁定行为

指定ROLLBACK TRANSACTIONsavepoint_name的语句释放除升级和转换外获取的任何锁。 这些锁不会释放,它们不会转换回以前的锁定模式。

权限

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

示例

以下示例显示了回滚已命名事务的效果。 创建表后,以下语句启动命名事务,插入两行,然后回滚变量中命名的 @TransactionName事务。 已命名的事务外的另一个语句将插入两行。 查询将返回前面的语句的结果。

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName VARCHAR(20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

下面是结果集:

value
-----
3
4