【发布时间】:2010-12-21 06:57:10
【问题描述】:
我已经阅读了 ROLLBACK TRANSACTION 和 nesting transactions 上的 MSDN。虽然我看到ROLLBACK TRANSACTION savepointname 的意思,但我不明白ROLLBACK TRANSACTION transactionname。
- 仅当
transactionname是最外层事务时才有效 -
ROLLBACK总是回滚整个事务“堆栈”,savepointname的情况除外
基本上,当我阅读文档时,除了保存点之外,ROLLBACK 会回滚所有事务(到@@TRANCOUNT=0)。我能看到的唯一区别是这个 sn-p:
如果一个 ROLLBACK TRANSACTION transaction_name 语句使用名称 外部事务在一组嵌套的任何级别执行 事务,所有嵌套事务都会回滚。 如果 ROLLBACK WORK 或 ROLLBACK TRANSACTION 语句没有 transaction_name 参数在一组嵌套的任何级别执行 事务,它回滚所有嵌套事务,包括 最外层的事务。
从阅读中,这向我表明回滚命名事务(必须是最外层事务的名称),只会回滚嵌套事务。这将为回滚命名事务提供一些意义。所以我设置了一个测试:
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 <b>named_transaction</b>的意义何在?
【问题讨论】:
标签: tsql sql-server-2008 transactions rollback