質問

ROLLBACK TRANSACTION および< href = "http://msdn.microsoft.com/en-us/library/ms189336.aspx" rel = "nofollow noreferrer">トランザクションのネスト。 ROLLBACK TRANSACTION savepointname のポイントを見ていますが、 ROLLBACK TRANSACTION transactionname がわかりません。

  1. transactionname が最も外側のトランザクションである場合にのみ機能します
  2. ROLLBACK は、 savepointname
  3. の場合を除いて、常にトランザクション「スタック」全体をロールバックします。

基本的に、ドキュメントを読むと、セーブポイントの場合を除き、 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)。

保存ポイントの実用的な例については、例外処理とネストされたトランザクション

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top