エラー条件からの回復は、アプリケーション・プログラミング、システム管理、 データベース管理、およびシステム操作において通常に行われる作業です。 データベースを複数のリモート・サーバーに分散させると、 ネットワークや通信の障害のためにエラーの発生する可能性が高くなります。 データ保全性を確保するため、データベース・マネージャーは 2 フェーズ・コミット・プロセスを提供しており、 この点については、2 フェーズ・コミット・プロセスについての (10)、 (11)、および (12) に示されています。 以下では、2 フェーズ・コミット・プロセス中のエラーをデータベース・マネージャーが処理する方法を説明します。
作業単位のコミット準備に失敗したことをいずれかのデータベースが伝えた場合、 データベース・クライアントはコミット・プロセスの第 2 フェーズで 作業単位をロールバックします。 この場合、準備メッセージはトランザクション・マネージャー・データベースに送信されません。
第 2 フェーズ中に、クライアントは、 第 1 フェーズでのコミットが正常に作成されたすべての参加データベースに、 ロールバック・メッセージを送信します。 それぞれのデータベースは、"ABORT" レコードをログ・ファイルに書き込み、 この作業単位のために保持していたロックを解放します。
この段階でのエラー処理は、第 2 フェーズでトランザクションがコミットされるか、 それともロールバックされるかによって違います。 最初のフェーズでエラーが検出された場合、 第 2 フェーズではトランザクションのロールバックしか実行されません。
参加データベースのうちの 1 つが (おそらく通信障害が原因で) 作業単位のコミットに失敗すると、 トランザクション・マネージャー・データベースによって、 失敗したデータベースでのコミットが再試行されます。 しかし、アプリケーションに対しては、 コミットが成功したと SQLCA を通して通知されます。 DB2 では、データベース・サーバー内のコミットされなかったトランザクションは、 確実にコミットされます。 トランザクション・マネージャー・データベースが作業単位のコミットを 試行してから次にコミットを試行するまでの待機間隔は、 データベース・マネージャー構成パラメーター resync_interval によって 指定されます (第 32 章, DB2 の構成 を参照)。 すべてのロックは、 作業単位がコミットされるまでデータベース・サーバーにおいて保持されます。
トランザクション・マネージャー・データベースに障害が起こった場合は、 データベースの再開時に作業単位が再同期化されます。 再同期化プロセスでは、未確定 トランザクション、 つまり第 1 フェーズは完了したが第 2 コミット・フェーズは完了していない トランザクションをすべて完了することが試行されます。 トランザクション・マネージャー・データベースに関連したデータベース・マネージャーは、 以下のようにして再同期化を実行します。
参加データベースのうちの 1 つに障害が起こって再始動した場合、 そのデータベースのデータベース・マネージャーはトランザクション・マネージャー・データベースに対して このトランザクションの状況を照会して、 トランザクションをロールバックすべきかどうかを判別します。 ログにトランザクションがない場合、 データベース・マネージャーはトランザクションがロールバックされたとみなして、 このデータベース内の未確定トランザクションをロールバックします。 ログにトランザクションがあれば、 データベースはトランザクション・マネージャー・データベースからのコミット要求を待ちます。
トランザクション処理モニター (XA 準拠のトランザクション・マネージャー) に よってトランザクションが調整された場合は、 データベースは常に TP モニターによって再同期を行います。
何らかの理由で、 トランザクション・マネージャーが自動的に未確定トランザクションを解決するまで待てない場合は、 未確定トランザクションを手動で解決するための措置がいくつかあります。 この手動の処理は、「発見的手法の決定」と呼ばれることもあります。 未確定トランザクションの手動回復について詳しくは、 発見的手法の決定を参照してください。
DB2 ユニバーサル・データベースの 2 フェーズ・コミット環境における構成の考慮事項については、 構成についてのその他の考慮事項を参照してください。
特に、データベース構成 パラメーター autorestart が OFF に設定されていて、 TM データベースまたは RM データベースのいずれかに未確定トランザクションがある場合、 再同期プロセスを始動するには RESTART DATABASE コマンドが必要です。 コマンド行プロセッサーから RESTART DATABASE コマンドを発行する時には、 別のセッションを使用してください。 同じセッションから別のデータベースを再始動すると、 前の呼び出しで確立された接続は除去され、もう一度再始動する必要があります。 LIST INDOUBT TRANSACTIONS コマンドによって戻される 未確定トランザクションがなくなったら、 TERMINATE コマンドを発行して接続を除去します。