我已经阅读了有关ROLLBACK TRANSACTION和nesting transactions的MSDN。 虽然我理解
如果在嵌套事务的任何级别执行使用外部事务名称的ROLLBACK TRANSACTION transaction_name语句,则所有嵌套事务都将回滚。如果在嵌套事务的任何级别上执行没有transaction_name参数的ROLLBACK WORK或ROLLBACK TRANSACTION语句,则会回滚所有嵌套事务,包括最外层的事务。从阅读中可以看出,这表明仅回滚命名事务(必须是最外层事务的名称),只会回滚嵌套事务。这将赋予回滚命名事务一些含义。因此,我设置了一个测试:
请注意,当我更改 时,输出结果 没有任何区别。
ROLLBACK TRANSACTION savepointname
的意义,但我不理解ROLLBACK TRANSACTION transactionname
。
transactionname
只能在最外层事务中使用。ROLLBACK
总是回滚整个事务“堆栈”,除非使用savepointname
。
ROLLBACK
会回滚所有事务(到@@TRANCOUNT=0
)。 我唯一能看到的区别是这段代码:如果在嵌套事务的任何级别执行使用外部事务名称的ROLLBACK TRANSACTION transaction_name语句,则所有嵌套事务都将回滚。如果在嵌套事务的任何级别上执行没有transaction_name参数的ROLLBACK WORK或ROLLBACK TRANSACTION语句,则会回滚所有嵌套事务,包括最外层的事务。从阅读中可以看出,这表明仅回滚命名事务(必须是最外层事务的名称),只会回滚嵌套事务。这将赋予回滚命名事务一些含义。因此,我设置了一个测试:
CREATE TABLE #TEMP (id varchar(50))
INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT
BEGIN TRAN OUTERTRAN
INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT
BEGIN TRAN INNERTRAN
INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT
ROLLBACK TRAN OUTERTRAN
IF @@TRANCOUNT > 0 ROLLBACK TRAN
SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT
DROP TABLE #TEMP
结果为(去除所有“X行受影响”的内容)
NOTRAN
--------------------------------------------------
NO
NOTRAN_TRANCOUNT
----------------
0
OUTERTRAN
--------------------------------------------------
NO
OUTER
OUTERTRAN_TRANCOUNT
-------------------
1
INNERTRAN
--------------------------------------------------
NO
OUTER
INNER
INNERTRAN_TRANCOUNT
-------------------
2
AFTERROLLBACK
--------------------------------------------------
NO
AFTERROLLBACK_TRANCOUNT
-----------------------
0
请注意,当我更改 时,输出结果 没有任何区别。
ROLLBACK TRAN OUTERTRAN
简单地
ROLLBACK TRAN
那么,ROLLBACK TRANSACTION named_transaction
的意义是什么呢?