ROLLBACK TRANSACTIONとネストされたトランザクションに関する MSDN を読みました。のポイントを見ているうちに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