Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)


4.9.8 トランザクション障害発生時の対処

OpenTP1とアプリケーションサーバ間のトランザクション連携中にサーバに障害が発生した場合や,サーバを強制停止した場合,通常はサーバを再起動すればOpenTP1とアプリケーションサーバの自動決着機能によってトランザクションは自動的に決着します。しかし,タイミングによっては,再起動してもトランザクションが自動的に決着しないで,仕掛かり中のまま残ることがあります。

また,OpenTP1とアプリケーションサーバ間で一時的な通信障害が発生した場合でも,通常はOpenTP1とアプリケーションサーバの通信リトライによってトランザクションは自動的に決着します。しかし,障害が発生したタイミングや復旧までに掛かった時間によっては,トランザクションが自動的に決着しないで,仕掛かり中のまま残ることがあります。このような場合,コマンドを使用して,仕掛かり中のトランザクションを決着する必要があります。

ここでは,次に示す障害発生時での,仕掛かり中のトランザクションへの対処方法を示します。

〈この項の構成〉

(1) OpenTP1に障害が発生,または強制停止した場合

トランザクション連携中にOpenTP1に障害が発生した場合や,強制停止した場合,次に示す手順で仕掛かり中のトランザクションの有無を確認し,トランザクションを決着してください。

  1. OpenTP1の再開始

    障害発生,または強制停止した原因を取り除き,OpenTP1を再開始します。OpenTP1を再開始できない場合の対処は,「4.9.8(5) OpenTP1に障害が発生した場合(再開始できない場合)」を参照してください。

  2. OpenTP1とアプリケーションサーバの仕掛かり中トランザクションの決着

    OpenTP1の再開始後に,「4.9.8(8) 仕掛かり中トランザクションの手動決着の順序」に従ってOpenTP1とアプリケーションサーバの仕掛かり中のトランザクションを決着してください。

  3. アプリケーションサーバだけに残っている仕掛かり中トランザクションの決着

    手順2.の完了後,30〜45秒経過後にアプリケーションサーバのメッセージログにKFCB40136-Wメッセージが出力される場合は,アプリケーションサーバ側だけに仕掛かり中のトランザクションが残っています。この場合,KFCB40136-Wメッセージの対処に従ってトランザクションを決着してください。KFCB40136-Wについては,マニュアル「アプリケーションサーバ メッセージ(構築/運用/開発用)」の「17.4 KFCB40000からKFCB49999までのメッセージ」を参照してください。

(2) アプリケーションサーバに障害が発生,または強制停止した場合

トランザクション連携中にアプリケーションサーバに障害が発生した場合や,強制停止した場合,次に示す手順で仕掛かり中のトランザクションの有無を確認し,トランザクションを決着してください。

  1. アプリケーションサーバの再起動

    障害発生,または強制停止した原因を取り除き,アプリケーションサーバを再起動します。

    アプリケーションサーバを再起動できない場合の対処は,「4.9.8(6) アプリケーションサーバに障害が発生した場合(再起動できない場合)」を参照してください。

  2. OpenTP1とアプリケーションサーバの仕掛かり中トランザクションの決着

    アプリケーションサーバの障害発生,または強制停止したあとに,OpenTP1の標準出力にKFCA00991-WおよびKFCA00960-Iメッセージが出力された場合は,OpenTP1またはアプリケーションサーバに仕掛かり中のトランザクションが残っているおそれがあります。この場合は,「4.9.8(8) 仕掛かり中トランザクションの手動決着の順序」に従ってOpenTP1とアプリケーションサーバの仕掛かり中のトランザクションを決着してください。

(3) OpenTP1とアプリケーションサーバに障害が発生した場合

トランザクション連携中にOpenTP1とアプリケーションサーバの両方に障害が発生した場合,次に示す手順で,仕掛かり中のトランザクションの有無を確認し,トランザクションを決着してください。

  1. アプリケーションサーバの再起動とOpenTP1の再開始

    障害発生の原因を取り除き,アプリケーションサーバを再起動して,OpenTP1を再開始してください。

    アプリケーションサーバを再起動できない場合の対処は,「4.9.8(6) アプリケーションサーバに障害が発生した場合(再起動できない場合)」を参照してください。OpenTP1を再開始できない場合の対処は,「4.9.8(5) OpenTP1に障害が発生した場合(再開始できない場合)」を参照してください。

    アプリケーションサーバの再起動とOpenTP1の再開始の順序に決まりはありません。

  2. OpenTP1とアプリケーションサーバの仕掛かり中トランザクションの決着

    OpenTP1の再開始後に,「4.9.8(8) 仕掛かり中トランザクションの手動決着の順序」に従ってOpenTP1とアプリケーションサーバの仕掛かり中のトランザクションを決着してください。

  3. アプリケーションサーバだけに残っている仕掛かり中トランザクションの決着

    手順2.完了後,30〜45秒経過後にアプリケーションサーバのメッセージログにKFCB40136-Wメッセージが出力される場合は,アプリケーションサーバ側だけに仕掛かり中のトランザクションが残っています。

    この場合,KFCB40136-Wメッセージの対処に従ってトランザクションを決着してください。KFCB40136-Wについては,マニュアル「アプリケーションサーバ メッセージ(構築/運用/開発用)」の「17.4 KFCB40000からKFCB49999までのメッセージ」を参照してください。

(4) 通信障害が発生した場合

トランザクション連携中にOpenTP1とアプリケーションサーバ間,または,アプリケーションサーバとリソース間で通信障害が発生した場合,次に示す手順で,仕掛かり中のトランザクションの有無を確認し,トランザクションを決着させてください。

  1. 通信路の復旧

    通信障害の原因を取り除き,通信路を復旧します。

  2. OpenTP1とアプリケーションサーバの仕掛かり中トランザクションの決着

    OpenTP1の標準出力にKFCA00991-WおよびKFCA00960-Iメッセージが出力されている場合は,OpenTP1またはアプリケーションサーバに仕掛かり中のトランザクションが残っているおそれがあります。この場合は,「4.9.8(8) 仕掛かり中トランザクションの手動決着の順序」に従ってOpenTP1とアプリケーションサーバの仕掛かり中のトランザクションを決着します。

  3. アプリケーションサーバだけに残っている仕掛かり中トランザクションの決着

    手順2.完了後,30〜45秒経過後にアプリケーションサーバのメッセージログにKFCB40136-Wメッセージが出力される場合は,アプリケーションサーバ側だけに仕掛かり中のトランザクションが残っています。

    この場合,KFCB40136-Wメッセージの対処に従ってトランザクションを決着します。KFCB40136-Wについては,マニュアル「アプリケーションサーバ メッセージ(構築/運用/開発用)」の「17.4 KFCB40000からKFCB49999までのメッセージ」を参照してください。

(5) OpenTP1に障害が発生した場合(再開始できない場合)

トランザクション連携中にOpenTP1に障害が発生し,すぐに再開始できない場合は,次に示す手順で,仕掛かり中のトランザクションの有無を確認し,トランザクションを決着させてください。

  1. トランザクションの決着状態の確認

    トランザクション処理を開始して30〜45秒経過後,アプリケーションサーバのメッセージログにKFCB40136-Wメッセージが出力される場合は,アプリケーションサーバ側に仕掛かり中のトランザクションが残っています。

    この場合,KFCB40136-Wメッセージの内容を確認して,OpenTP1に関連づいたリソースがコミット決着したかロールバック決着したかを確認してください。

  2. トランザクションの決着

    手順1.の確認結果に応じてアプリケーションサーバ側のトランザクションをcjcommittrnコマンドまたはcjrollbacktrnコマンドで決着してください。

(6) アプリケーションサーバに障害が発生した場合(再起動できない場合)

トランザクション連携中にアプリケーションサーバに障害が発生し,すぐに再起動できない場合は,cjlisttrnfileコマンドとアプリケーションサーバのPRFトレースを使用して,次に示す手順で仕掛かり中のトランザクションの有無を確認し,トランザクションを決着させてください。

  1. アプリケーションサーバに残っている仕掛かり中トランザクションの有無の確認

    アプリケーションサーバに障害が発生している場合は,cjlisttrnコマンドを使用できないため,cjlisttrnfileコマンドで仕掛かり中トランザクションの有無を確認します。

    確認結果の出力例を次に示します。

    > cjlisttrnfile
    [Global transaction information(status file)]
    status file1: C:\Program Files\HITACHI\Cosminexus\CC\server\public\ejb\MyServer\
    otsstatus\transaction_1.status
    host       (recorded in status file): "apsv1"
    J2EE server(recorded in status file): "Myserver"
     
    Status    GlobalTransactionId                                      BranchType
    --------- -------------------------------------------------------- ----------
    Prepared  d13800010000000000000000000000fefb58e6480000000000000001 Sub
    Prepared  d13800010000000000000000000001fefb58e6480000000000000002 Sub
     
    total count: 2
  2. アプリケーションサーバ側のトランザクションの決着状態の確認

    手順1.で出力されたトランザクションについて,アプリケーションサーバに関連するリソースがコミット決着またはロールバック決着したかを確認します。

    なお,トランザクションの一貫性が保たれていない場合は修復してください。

    アプリケーションサーバに関連するリソースのトランザクションの決着状態の確認方法,およびトランザクションの修復方法については,リソースのマニュアルを参照してください。

  3. OpenTP1のトランザクショングローバル識別子の特定

    アプリケーションサーバのPRFトレースの内容を基に,OpenTP1のトランザクショングローバル識別子を特定します。トランザクショングローバル識別子の特定方法の例を次の図に示します。

    図4‒18 OpenTP1のトランザクショングローバル識別子の特定

    [図データ]

    0x9400のOPT(ASCII列)が手順1.の出力例の「GlobalTransactionId」部分と一致するPRFトレースを特定します。0x9400と同じルートAP情報の0xAA00のOPT(ASCII列)の5文字目から20文字目までの文字列が,OpenTP1のトランザクショングローバル識別子となります。

  4. OpenTP1側のトランザクションの決着状態の確認

    手順3.で特定したOpenTP1のトランザクショングローバル識別子について,OpenTP1に関連するリソースがコミット決着またはロールバック決着したかを確認します。トランザクションの一貫性が保たれていない場合は,修復してください。

(7) OpenTP1とアプリケーションサーバに障害が発生した場合(再開始または再起動できない場合)

トランザクション連携中にOpenTP1とアプリケーションサーバに障害が発生し,すぐに再開始または再起動できない場合は,「4.9.8(6) アプリケーションサーバに障害が発生した場合(再起動できない場合)」の手順に従って仕掛かり中のトランザクションの有無を確認し,仕掛かり中のトランザクションがあれば決着してください。

(8) 仕掛かり中トランザクションの手動決着の順序

OpenTP1とアプリケーションサーバ間のトランザクション連携中に障害が発生すると,OpenTP1またはアプリケーションサーバに仕掛かり中のトランザクションが残っているおそれがあります。この場合,次に示す手順で仕掛かり中のトランザクションの有無を確認し,トランザクションを決着させてください。仕掛かり中のトランザクションが複数ある場合は,次に示す手順を繰り返してください。

  1. OpenTP1の仕掛かり中トランザクションの状態確認

    OpenTP1のtrnlsコマンドを実行し,OpenTP1のトランザクションの状態を確認します。このとき,-tオプションを指定します。

    > trnls -t
    TRNGID                 TRNBID             状態                       PID    サーバ   サービス
    cab9TP1S0000074f       TP1STP1S0000074f   HEURISTIC_FORGETTING(p,n)  0   TP1S
  2. OpenTP1の仕掛かり中トランザクションの強制終了

    手順1.の実行結果の「状態」部分が"HEURISTIC_FORGETTING"以外の場合は,手順3.へ進みます。「状態」部分が"HEURISTIC_FORGETTING"の場合は,OpenTP1のtrnfgtコマンドを実行し,OpenTP1のトランザクションを強制終了します。このとき,-Tオプションに手順1.の実行結果の「TRNGID」部分を指定します。

    > trnfgt -T cab9TP1S0000074f

    トランザクションの実行状態によっては,trnfgtコマンドは正常終了してもOpenTP1のトランザクションを強制終了できていなかったり,trnfgtコマンドがKFCA00970-Eを出力して異常終了していたりすることがあります。この場合は手順3.に進み,アプリケーションサーバの仕掛かり中トランザクションをすべて決着してから,手順5.を実施してください。

  3. アプリケーションサーバの仕掛かり中トランザクションの特定

    アプリケーションサーバのcjlisttrnコマンドを実行し,手順1.の実行結果の「TRNGID」部分と,cjlisttrnコマンドの実行結果の「TP1TRNGID」部分が一致するトランザクションを特定します。このとき,-tp1オプションと-pendingオプションを指定します。

    なお,この例では,決着するアプリケーションサーバの仕掛かり中トランザクションの「Status」部分は"Prepared"となります。

    > cjlisttrn MyServer -tp1 -pending
    [Global transaction information]
    Status            GlobalTransactionId                                      ElapsedTime BranchType TP1TRNGID        TP1TRNBID
    ----------------- -------------------------------------------------------- ----------- ---------- ---------------- ----------------
    Prepared          d13800010000000000000000000000fefb58e6480000000000000001          30 Sub        cab9TP1S0000074f @@@@TP1S0000074f
     
    total count: 1
  4. アプリケーションサーバの仕掛かり中トランザクションの決着

    • 手順1.の実行結果の「状態」部分が"HEURISTIC_FORGETTING",または"COMMIT"だった場合

      アプリケーションサーバのcjcommittrnコマンドを実行し,アプリケーションサーバの仕掛かり中トランザクションをコミットで決着します。このとき,-gidオプションに手順3.で特定したアプリケーションサーバの仕掛かり中トランザクションの「GlobalTransactionId」部分を指定します。

      > cjcommittrn MyServer -gid d13800010000000000000000000000fefb58e6480000000000000001
    • 「状態」部分が"ROLLBACK"だった場合

      アプリケーションサーバのcjrollbacktrnコマンドを実行し,アプリケーションサーバの仕掛かり中トランザクションをロールバックで決着します。このとき,-gidオプションに手順3.で特定したアプリケーションサーバの仕掛かり中トランザクションの「GlobalTransactionId」部分を指定します。

      > cjrollbacktrn MyServer -gid d13800010000000000000000000000fefb58e6480000000000000001
  5. コマンドで決着できないOpenTP1の仕掛かり中トランザクションの強制終了

    手順1.の実行結果の「状態」部分が"COMMIT",または,手順2.のtrnfgtコマンドを実行しても強制終了できなかった"HEURISTIC_FORGETTING"のトランザクションは,コマンドを使った手動決着ができません。

    そのため,すべての仕掛かり中のトランザクションに対して手順1.〜4.を実施したあと,再度OpenTP1のtrnlsコマンドを実行します。コマンド実行後,「状態」部分に"COMMIT"または"HEURISTIC_FORGETTING"のトランザクションが残っている場合は,OpenTP1を強制停止してから強制正常開始してください。