2 フェーズ・コミット

トランザクションが管理される方法を理解しておけば、 2 フェーズ・コミット処理中にエラーが発生した場合の問題の解決に役立ちます。

図 1 は、マルチサイト更新に関連するステップを示しています。

図1: 複数のデータベースの更新
2 フェーズ・コミット・サブプロセスを示す図。
0
アプリケーションは 2 フェーズ・コミットの準備をします。 これはプリコンパイル・オプションを使用して行われます。 これは、 Db2® CLI (コール・レベル・インターフェース) 構成を使用して行うこともできます。
1
データベース・クライアントが SAVINGS_DB (普通預金) データベースに接続しようとするとき、 まず内部でトランザクション・マネージャー (TM) データベースに接続します。 TM データベースは、データベース・クライアントに対し肯定応答を戻します。 データベース・マネージャー構成パラメーター tm_database1ST_CONN に設定されていれば、 このアプリケーション・インスタンスの存続期間中は SAVINGS_DB が トランザクション・マネージャーになります。
※2
SAVINGS_DB データベースに対する接続が行われ、肯定応答が受信されます。
3
データベース・クライアントは SAVINGS_ACCOUNT (普通預金) 表の更新を開始します。 これにより、作業単位が始まります。 TM データベースはデータベース・クライアントに対し応答し、 作業単位のトランザクション ID を送信します。 作業単位が登録されるのは、接続の確立時ではなく、 作業単位内の最初の SQL ステートメントの実行時であることに注意してください。
4
データベース・クライアントは、トランザクション ID を受信すると、 この作業単位を SAVINGS_ACCOUNT 表を含むデータベースに登録します。 作業単位登録が正常完了したことを通知する応答がクライアントに送り返されます。
5
SAVINGS_DB データベースに対して出された SQL ステートメントは、 通常の方法で処理されます。 各ステートメントに対する応答は、 プログラムに組み込まれている SQL ステートメントの処理時に SQLCA に戻されます。
6
作業単位中で、TRANSACTION_FEE (手数料) 表が入っている FEE_DB (手数料) データベースに最初にアクセスするとき、そのデータベースにトランザクション ID が登録されます。
7
FEE_DB データベースに対するすべての SQL ステートメントが通常の方法で処理されます。
8
必要に応じて、接続を設定することによって、SAVINGS_DB データベースに対してさらに SQL ステートメントを実行できます。 作業単位はすでに SAVINGS_DB データベースに登録されているため 4、 データベース・クライアントは再び登録ステップを実行する必要はありません。
9
CHECKING_DB (当座預金) データベースに接続してそれを使用する方法は、 6 および 7 と同じ規則に従います。
10
データベース・クライアントからこの作業単位をコミットするよう要求が出されると、 この作業単位に関係しているすべてのデータベースに対して準備 (prepare) メッセージが送信されます。 各データベースは "PREPARED" レコードをログ・ファイルに書き込み、 データベース・クライアントに対して応答を戻します。
11
すべてのデータベースから肯定応答を受信すると、 データベース・クライアントはトランザクション・マネージャー・データベースにメッセージを送信して、 作業単位のコミット準備が完了した (PREPARED) ことを通知します。 トランザクション・マネージャー・データベースは、 "PREPARED" レコードをそのログ・ファイルに書き込み、 クライアントに応答メッセージを送信して、 コミット・プロセスの第 2 フェーズが開始可能になったことを通知します。
12
コミット・プロセスの第 2 フェーズ実行時に、 データベース・クライアントはすべての参加データベースに、 コミットするよう依頼するメッセージを送信します。 それぞれのデータベースが "COMMITTED" レコードをそのログ・ファイルに書き込み、 この作業単位に保持していたロックを解放します。 データベースが変更内容のコミットを完了すると、クライアントに応答を送信します。
13
すべての参加データベースから肯定応答を受信すると、 データベース・クライアントはトランザクション・マネージャー・データベースに対して、 作業単位が完了したことを通知するメッセージを送ります。 その後、トランザクション・マネージャー・データベースは作業単位が完了したことを 示す "COMMITTED" レコードをログ・ファイルに記録し、 クライアントに対して作業単位が完了したという応答を送ります。