未確定トランザクションの手動での解決

XA 準拠のトランザクション・マネージャー (トランザクション処理モニター) は、 Db2® トランザクション・マネージャーによって使用されるものと同様の 2 フェーズ・コミット・プロセスを使用します。 これら 2 つの環境の主な違いは、 Db2 トランザクション・マネージャーおよびトランザクション・マネージャー・データベースの代わりに、 TP モニターがトランザクションのロギングや制御の機能を提供することです。

Db2 トランザクション・マネージャーについて起きるエラーと同様のエラーが、 XA 準拠のトランザクション・マネージャー使用中にも起きることがあります。 Db2 トランザクション・マネージャーと同様、 XA 準拠のトランザクション・マネージャーは未確定トランザクションの再同期を試行します。

トランザクション・マネージャーが自動的に未確定トランザクションを解決するまで待てない場合は、 未確定トランザクションを手動で解決できます。 この手動の処理は、ヒューリスティック判定 と呼ばれることもあります。

このタスクについて

LIST INDOUBT TRANSACTIONS コマンド ( WITH PROMPTING オプションを使用)、または関連する API セット (db2XaListIndTranssqlxphcmsqlxhfrgsqlxphrl) を使用すると、未確定トランザクションを照会、コミット、およびロールバックすることができます。 さらに、ログ・レコードを削除してログ・スペースを解放することにより、ヒューリスティックな手法でコミットまたはロールバックされたトランザクションを forget することもできます。

未確定トランザクションを手動で解決するこれらのコマンド (または関連する API) は、あくまでも最後の手段として、細心の注意 を払って使用してください。 最善の方法は、トランザクション・マネージャーが再同期プロセスを始めるまで待つことです。 ある参加データベースでは手動でトランザクションのコミットまたはロールバックを実行し、 別の参加データベースでは正反対の処置を取ると、データ保全の問題が生じることがあります。 データ保全性の問題からリカバリーするには、アプリケーション・ロジックを理解し、変更またはロールバックされたデータを識別してから、データベースのポイント・イン・タイム・リカバリーを実行するか、変更を手動で元に戻すか再適用する必要があります。 トランザクション・マネージャーが再同期処理を開始するのを待つことができず、未確定トランザクションによって拘束されたリソースを解放する必要がある場合は、ヒューリスティック操作が必要です。 このような状況は、 トランザクション・マネージャーが長時間使用できないために再同期を実行することができず、 緊急に必要なリソースが未確定トランザクションによって拘束されている場合に発生する可能性があります。 トランザクション・マネージャーまたはリソース・マネージャーが使用不能になる前に未確定トランザクションに関連していたリソースは、 依然としてそのトランザクションに結び付けられています。 データベース・マネージャーの場合、これらのリソースには、表や索引のロック、ログのスペース、 およびそのトランザクションにより占有されているストレージなどが含まれます。 各未確定トランザクションごとに、 データベースで処理できる並行トランザクションの最大数も (1 つずつ) 減っていきます。 さらに、すべての未確定トランザクションが解決されるまで、オフライン・バックアップは行うことはできません。

以下の状況では、ヒューリスティックな手法の forget 関数が必要です。
  • ヒューリスティックな手法でコミットまたはロールバックされたトランザクションが原因で、 ログ満杯状態が発生した場合 (LIST INDOUBT TRANSACTIONS コマンドからの出力に示される)
  • オフライン・バックアップが行われる場合
ヒューリスティックな手法の forget 関数を実行すると、 未確定トランザクションが占有していたログ・スペースが解放されます。 つまり、トランザクション・マネージャーが この未確定トランザクションに関して再同期操作を実行すると、 このリソース・マネージャーにはトランザクションのログ・レコードがないために、 他のリソース・マネージャーのコミットやロールバックを行うという 間違った決定を下す危険性があります。 一般に、ログ・レコードが欠落しているということは、 リソース・マネージャーがトランザクションをロールバックしたことを暗示します。

プロシージャー

未確定トランザクションを手動で解決するには、以下のようにします。

  1. すべてのトランザクションを完了しなければならないデータベースに接続する。
  2. 以下のようにして、未確定トランザクションを表示します。
    1. Db2 データベース・サーバーの場合は、 LIST INDOUBT TRANSACTIONS WITH PROMPTING コマンドを使用します。
      このとき、xid はグローバル・トランザクション ID を表し、 このトランザクションに参加しているトランザクション・マネージャーや他のリソース・マネージャーが使用する xid と同じです。 LIST INDOUBT TRANSACTIONS コマンドは、対話式セッションの開始時に未確定トランザクションの現在の状態を返しますが、サーバー上で状況が変更されても、クライアント上で出力がリフレッシュされることはありません。 状況が変化したために、有効なオプションとしてリストに示されているアクションの一部を実行できなくなった場合は、その対話式セッションを終了して新しいセッションを開始するように指示するエラー・メッセージが返されます。
    2. ホストまたは System i ® データベース・サーバーの場合は、以下のいずれかを使用できます。
      ホストまたは System i サーバーから未確定情報を直接入手する。 Db2 for z/OS®から未確定情報を直接取得するには、 DISPLAY THREAD TYPE(INDOUBT) コマンドを呼び出します。 ヒューリスティック判定を実施するには、RECOVER コマンドを使用します。 Db2 for IBM® iから未確定情報を直接取得するには、 wrkcmtdfn コマンドを呼び出します。
      未確定情報は、ホストまたは System i データベース・サーバーへのアクセスに使用される Db2 Connect サーバーから取得できます。 未確定情報は、ホストまたは System i データベース・サーバーへのアクセスに使用される Db2 Connect サーバーから取得できます。
  3. 各未確定トランザクションについて、 アプリケーションとオペレーティング環境に関して示された情報を活用して、 他の参加リソース・マネージャーを判別する。
  4. 未確定トランザクションごとに、取るべき処置を判断する。
    • トランザクション・マネージャーが使用可能であり、 かつリソース・マネージャーが第 2 コミット・フェーズまたはそれ以前の再同期プロセスで使用可能でなかったためにリソース・マネージャー内で未確定トランザクションが発生した場合は、以下のようにします。
      1. トランザクション・マネージャーのログを調べて、 他のリソース・マネージャーに対しどのようなアクションがとられたかを判別します。
      2. そのデータベースに対して同じ処置を取ります。 つまり、LIST INDOUBT TRANSACTIONS WITH PROMPTING コマンドを使って、 トランザクションをヒューリスティックな手法でコミットするか、 またはヒューリスティックな手法でロールバックします。
    • トランザクション・マネージャーが利用不能 であれば、 他の参加リソース・マネージャーにおけるそのトランザクションの状況を利用して、 以下のように取るべき処置を判断します。
      • 他のリソース・マネージャーのうちの少なくとも 1 つがそのトランザクションをコミットしていれば、 すべてのリソース・マネージャー内でそのトランザクションをヒューリスティックな手法でコミットしてください。
      • 他のリソース・マネージャーのうちの少なくとも 1 つがそのトランザクションをロールバックしていれば、 そのトランザクションをヒューリスティックな手法でロールバックしてください。
      • そのトランザクションがすべての参加リソース・マネージャーで準備済み (未確定) 状態であれば、 そのトランザクションをヒューリスティックな手法でロールバックしてください。
      • 他のリソース・マネージャーがまったく使用不可であれば、 そのトランザクションをヒューリスティックな手法でロールバックしてください。

次の作業

Db2から未確定トランザクション情報を取得するには、データベースに接続して LIST INDOUBT TRANSACTIONS WITH PROMPTING コマンドを発行するか、クライアント・アプリケーションから db2XaListIndTrans API を呼び出します。