“ ROLLBACK TRANSACTION named_transaction”のポイントは何ですか?
-
06-07-2019 - |
質問
ROLLBACK TRANSACTION および< href = "http://msdn.microsoft.com/en-us/library/ms189336.aspx" rel = "nofollow noreferrer">トランザクションのネスト。 ROLLBACK TRANSACTION savepointname
のポイントを見ていますが、 ROLLBACK TRANSACTION transactionname
がわかりません。
-
transactionname
が最も外側のトランザクションである場合にのみ機能します -
ROLLBACK
は、savepointname
の場合を除いて、常にトランザクション「スタック」全体をロールバックします。
基本的に、ドキュメントを読むと、セーブポイントの場合を除き、 ROLLBACK
はすべてのトランザクションを( @@ TRANCOUNT = 0
に)ロールバックします。私が見ることができる唯一の違いはこのスニペットです:
の名前を使用した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
結果として(すべての&quot; X行が影響を受けました&quot;ものが削除されます)
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
のポイントは何ですか?
解決
保存ポイントは、名前が示すとおり、ログシーケンスの「ポイントの保存」です。ログシーケンスは常に線形です。セーブポイントにロールバックすると、現在のログ位置とセーブポイントの間でトランザクションが行ったすべての をロールバックします。あなたの例を考えてみましょう:
LSN 1: BEGIN TRAN OUTERTRAN
LSN 2: INSERT INTO ...
LSN 3: BEGIN TRAN INNERTRAN
LSN 4: INSERT INTO ...
LSN 5: ROLLBACK TRAN OUTERTRAN
ログシーケンス番号(LSN)1で、OUTERTRANセーブポイントが作成されます。最初のINSERTはLSN 2を作成します。次に、INNERTRANはLSN 3を使用してセーブポイントを作成します。2番目のINSERTは新しいLSN、4を作成します。ログの一部を「スキップ」することはできないため、LSN 1(セーブポイントOUTERTRANが作成されたとき)がヒットするまで、ログ内のすべての操作をロールバックする必要があります。
一方、最後の操作でROLLBACK INNERTRANを発行すると、エンジンはLSN 3(「INNERTRAN」保存ポイントがログに挿入された)までロールバックし、LSN 1とLSN 2を保存します(つまり、最初のINSERT)。
保存ポイントの実用的な例については、例外処理とネストされたトランザクション。