ROLLBACK TRANSACTION (Transact-SQL)
适用于:Microsoft Fabric 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Warehouse
此语句将显式或隐式事务回滚到事务的开头,或回滚到事务内的保存点。 可用于 ROLLBACK TRANSACTION
清除从事务开始或保存到保存点进行的所有数据修改。 它还释放由事务控制的资源。
回滚事务不包括对局部变量或表变量所做的更改。 此语句不会清除这些更改。
语法
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 }
[ ; ]
参数
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
不会向用户生成任何消息。 如果在存储过程或触发器中需要警告,请使用 RAISERROR
或 PRINT
语句。 RAISERROR
是用于指示错误的首选语句。
注解
ROLLBACK TRANSACTION
没有savepoint_name或transaction_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_name 或 transaction_name 的语句将所有语句回滚到最外层 BEGIN TRANSACTION
。 ROLLBACK TRANSACTION
存储过程中的语句,当存储过程完成@@TRANCOUNT
时导致@@TRANCOUNT
具有不同于调用存储过程时的值生成信息性消息的语句。 此消息不会影响后续处理。
如果在触发器中颁发了 a ROLLBACK TRANSACTION
:
将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。
触发器继续执行语句后
ROLLBACK
的任何剩余语句。 如果这些语句中的任意语句修改数据,则不回退这些修改。 执行其余的语句不会激发嵌套触发器。不会执行触发触发器的语句之后批处理中的语句。
@@TRANCOUNT
在进入触发器时,即使处于自动提交模式,也会递增一个。 (系统将触发器视为隐含的嵌套事务处理。)
ROLLBACK TRANSACTION
存储过程中的语句不会影响调用该过程的批处理中的后续语句;将执行批处理中的后续语句。 ROLLBACK TRANSACTION
触发器中的语句终止包含触发触发器的语句的批处理;不会执行批处理中的后续语句。
游标的效果 ROLLBACK
由以下三个规则定义:
使用
CURSOR_CLOSE_ON_COMMIT
setON
,ROLLBACK
关闭但不释放所有打开的游标。OFF
设置CURSOR_CLOSE_ON_COMMIT
后,ROLLBACK
不会影响任何已完全填充的打开同步STATIC
或INSENSITIVE
游标或异步STATIC
游标。 将关闭但不释放任何其他类型的打开的游标。终止批处理并生成内部回滚的错误将释放在包含错误声明的批处理中声明的所有游标。 无论游标的类型或设置
CURSOR_CLOSE_ON_COMMIT
如何,所有游标都会解除分配。 这包括在错误批处理调用的存储过程中声明的游标。 在错误批处理之前在批处理中声明的游标受前两个规则的约束。 死锁错误便是此类错误的一个示例。ROLLBACK
触发器中颁发的语句也会自动生成这种类型的错误。
锁定行为
指定ROLLBACK TRANSACTION
savepoint_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