神谷 雅紀
Escalation Engineer
SQL Server における分散トランザクション 1 の続きです。
前回の投稿では、SQL Server における MSDTC の接続を確立する際の振る舞いと、コミットまでの動作を説明しました。本投稿では、ロールバック時のシナリオや異常系シナリオについて説明します。
分散トランザクションの流れ (前回からの続き)
8) トランザクションのロールバック
ロールバック前までの流れは、前回紹介したコミットの場合と同様です。
8-1) アプリケーションは、アプリケーション側 MS DTC に対して、トランザクションのロールバック (中断) を要求します。
8-2) アプリケーション側 MS DTC は、SQL Server 側 MS DTC に対して、トランザクションの中断を要求し、その要求は SQL Server に対しても行われます。
この時、Transaction is aborting トレース/拡張イベントが生成されます。
8-3) SQL Server でのロールバックが完了すると、その完了が SQL Server 側 MS DTC に通知され、それはアプリケーション側 MS DTC にも通知されます。
8-4) アプリケーション側 MS DTC から アプリケーションに対して、ロールバックの完了が通知されます。
|
9) 分散トランザクションの例外フロー
a) MS DTC が停止した場合
MS DTC proxy と MS DTC との間の接続が途切れると、実行中のトランザクションが準備状態ではない場合には、MS DTC proxy は SQL Server に対してトランザクションの中断を要求します。
トランザクションが準備完了状態にある場合、MS DTC proxy は MS DTC との接続が途切れたことを SQL Server に通知します。SQL Server は、この通知を受けると、復旧プロセスを開始します。このプロセスは、MS DTC との接続が回復するまで繰り返し行われます。MS DTC との接続が回復し、トランザクションの結果 (コミットまたはロールバック) を受け取れるまでの間、トランザクションは in-doubt 状態となります。
MS DTC との接続が回復できた場合、SQL Server は同じリソースマネージャー ID を MS DTC に渡しますので、MS DTC は、自身が停止する前と同じリソースマネージャーが復帰してきたことを認識します。SQL Server は、トランザクション状態に関する情報を取得し、トランザクションに再参加します。その後、取得したトランザクションの結果がコミットであれば、in-doubt 状態のトランザクションをコミットし、ロールバックであればロールバックします。
MS DTC との接続が回復できず、トランザクションがどうなったのか判断できない状態に陥った場合、そのトランザクションを完了させるためには、データベースを再起動する必要があります。データベース再起動時にトランザクションをどのようにするかは、sp_configure ‘in-doubt xact resolution’ の設定により異なります。
in-dout xact resolution |
データベース起動時の動作 |
0 |
トランザクションの結果が不明な場合、データベース復旧は失敗し、データベースはアクセス不可となります。 |
1 |
トランザクションの結果が不明な場合、トランザクションはコミットされます。 |
2 |
トランザクションの結果が不明な場合、トランザクションはロールバックされます。 |
|
b) SQL Server が停止した場合
SQL Server が一旦停止し、その後復帰すると、SQL Server が起動する際には、改めて MS DTC との接続が確立されます。MS DTC は、リソースマネージャー ID により同じリソースマネージャーが復帰してきたことを認識します。SQL Server は中断されていたトランザクションがあれば、そのトランザクションに再度エンリストし、トランザクションの結果に従い、ロールバックまたはコミットします。