2.2.3 2相コミット
複数の資源を更新するとき,トランザクションは同期点で,2相コミットと呼ばれる方法で最終的に資源を更新するかどうか決定します。2相コミットとは,同期点処理を資源の更新準備処理(プリペア処理)と,資源の更新処理(コミット処理またはロールバック処理)の二段階に分ける方法です。同期点処理を二つの相に分けることで,複数の資源を矛盾なく更新できます。
同期点の第1相で,ルートトランザクションブランチがグローバルトランザクション内のすべてのトランザクションブランチに,コミットの準備を要求します。トランザクションブランチは,コミットの準備が完了したか,ロールバックしたかを,ルートトランザクションブランチに報告します。
同期点の第2相で,グローバルトランザクションをロールバックするかコミットするか決定します。すべてのトランザクションブランチでコミットの準備が完了すると,ルートトランザクションブランチはグローバルトランザクション全体のコミットを決定します。トランザクションブランチのどれかがロールバックしたときには,ルートトランザクションブランチはグローバルトランザクション全体のロールバックを決定します。グローバルトランザクション内のトランザクションブランチはすべて,ルートトランザクションブランチでの決定に従います。
トランザクションの決着(コミット決定,またはロールバック決定)以降にシステムに障害が発生した場合に備えて,2相コミット処理の過程でトランザクションに関する履歴情報を,ステータスファイルに取得します。
2相コミットの流れを次の図に示します。
- 〈この項の構成〉
(1) ヒューリスティック決着
ルートトランザクションブランチがトランザクションブランチにコミットの準備を指示したあとで通信障害が発生して,ルートトランザクションブランチでの決着がトランザクションブランチに届かなくなることを,ヒューリスティックハザードといいます。ヒューリスティックハザードが起こった場合には,コマンドを使って,トランザクションブランチごとにトランザクションを強制的に決着できます。ルートトランザクションブランチの同期点処理を待たないで,コマンドでトランザクションブランチのトランザクションを強制的に決着することを,ヒューリスティック決着といいます。
ヒューリスティック決着には,次に示す種類があります。
-
ルートトランザクションの決着結果に関係なく,トランザクションブランチをコミットすることです。
-
ルートトランザクションの決着結果に関係なく,トランザクションブランチをロールバックすることです。
ヒューリスティックコミットにするときにはeetrncmtコマンドを,ヒューリスティックロールバックにするときにはeetrnrbkコマンドを使います。コミットまたはロールバックしたトランザクションブランチを強制終了する場合は,eetrnfgtコマンドを使います。
コミットかロールバックかは,ルートトランザクションブランチとトランザクションブランチとで一致させてください。一致させるためには,まずルートトランザクションブランチがコミットしたかロールバックしたかをeetrnlstrコマンドを使って調べます。eetrnlstrコマンドで表示した状態を参照した上で,eetrncmtコマンドまたはeetrnrbkコマンドを実行します。
コマンドでトランザクションを決着させた場合,トランザクションの扱いについては十分考慮してください。ルートトランザクションブランチの決着とトランザクションブランチの決着とが矛盾(ヒューリスティックミックス)しないように十分注意してからeetrncmtコマンドまたはeetrnrbkコマンドを実行してください。
ヒューリスティック決着の操作方法については,マニュアル「TP1/Server Base Enterprise Option 使用の手引」のトランザクションに関する運用の説明を参照してください。
ヒューリスティック決着の流れを次の図に示します。