Menu Close

5.5. ヒューリスティックな結果のリカバリー

トランザクションの更新をコミットまたはロールバックするために、分散トラザクションの完了段階中にトランザクションリソースが一方的な決定を行うと、ヒューリスティックな完了が発生します。これにより、分散データが不確定な状態のままになる可能性があります。可能性として、ネットワークの障害やリソースのタイムアウトがヒューリスティックな完了の原因となることがあります。ヒューリスティックな完了によって、以下のヒューリスティックな結果の例外の 1 つが発生します。

HEURISTIC_COMMIT
トランザクションマネージャーがロールバックの実行を決定するとこの例外が発生しますが、すべてのリソースはすでに独自にコミットしています。この場合、一貫して完了しているため、何もする必要はありません。
HEURISTIC_ROLLBACK
この例外は、トランザクションマネージャーからのコミットの決定が遅れたため、リソースがすべてロールバックしたことを意味します。一貫して完了しているため、HEURISTIC_COMMIT と同様に何もする必要はありません。
HEURISTIC_HAZARD
この例外は、更新の一部の処理が不明であるため発生します。不明なものはすべてコミットまたはロールバックされています。
HEURISTIC_MIXED
この例外は、トランザクションの一部がロールバックされ、残りの部分がコミットされると発生します。

この手順では、Java Transaction API (JTA) を使用してトランザクションのヒューリスティックな結果を処理する方法を説明します。

  1. トランザクションのヒューリスティックな結果の原因は、リソースマネージャーがコミットまたはロールバックの実行を約束したにも関わらず、約束を守らなかったことにあります。原因としては、サードパーティーコンポーネント、サードパーティーコンポーネントと JBoss EAP 間の統合レイヤー、または JBoss EAP 自体の問題が考えられます。

    ヒューリスティックなエラーの最も一般的な 2 つの原因は、環境での一時的な障害と、リソースマネージャー対応時のコーディングエラーです。

  2. 通常、環境内で一時的な障害が発生した場合は、ヒューリスティックなエラーを発見する前に気づくはずです。原因としては、ネットワークの停止、ハードウェア障害、データベース障害、電源異常などが考えられます。

    ストレステストの実施中にテスト環境でヒューリスティックな結果が発生した場合は、テスト環境の脆弱性を意味します。

    警告

    JBoss EAP は、障害発生時にヒューリスティックな状態ではないトランザクションを自動的にリカバリーしますが、ヒューリスティックなトランザクションのリカバリーは実行しません。

  3. 環境に明白な障害が発生していない場合や、ヒューリスティックな結果を簡単に再現できる場合は、おそらくコーディングエラーが原因です。サードパーティーベンダーに連絡して解決策があるかどうかを確認する必要があります。

    JBoss EAP のトランザクションマネージャー自体に問題があることを疑う場合は、サポートチケットを作成する必要があります。

  4. 管理 CLI を使用して手動によるトランザクションのリカバリーを試すことができます。トランザクションを手作業でリカバリーする手順は、「トランザクション参加者のリカバリー」を参照してください。
  5. トランザクションの結果を手作業で解決する処理は、障害の正確な状況によって異なります。環境に合わせて以下の手順を実行します。

    1. 関係しているリソースマネージャーを特定します。
    2. トランザクションマネージャーとリソースマネージャーの状態を調べます。
    3. 関係するコンポーネントの 1 つまたは複数で、ログの消去とデータの照合を手動で強制します。
  6. テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除して JBoss EAP を再起動すると、ヒューリスティックな結果はなくなります。デフォルのトランザクションログの場所はスタンドアロンサーバーでは EAP_HOME/standalone/data/tx-object-store/ ディレクトリー、管理対象ドメインでは EAP_HOME/domain/servers/SERVER_NAME/data/tx-object-store/ ディレクトリーになります。管理対象ドメインの場合、 SERVER_NAME は、サーバーグループに参加している個々のサーバー名を示します。

    注記

    トラザクションログの場所は、使用中のオブジェクトストアや、object-store-relative-to および object-store-path パラメーターに設定された値にも左右されます。標準のシャドーログや Apache ActiveMQ Artemis ログなどのファイルシステムログの場合、デフォルトディレクトリーの場所が使用されますが、JDBC オブジェクトストアを使用する場合は、トランザクションログはデータベースに保存されます。

5.5.1. ヒューリスティックな結果を判断するためのガイドライン

問題の検出

ヒューリスティックな決定は、トランザクションシステムで発生する可能性がある最も重大なエラーの 1 つです。これにより、トランザクションの一部がコミットされ、他の部分がロールバックされます。そのため、トランザクションのアトミックな特性に反し、データの整合性が保たれなくなる可能性があります。

リカバリー可能なリソースは、トランザクションマネージャーが要求するまで、ヒューリスティックな決定に関するすべての情報を安定したストレージに保持します。安定したストレージに保存される実際のデータは、リカバリー可能なリソースの種類によって異なり、標準化されていません。データを解析し、データ整合性の問題を修正するためにリソースを編集することも可能です。

ヒューリスティックな結果はサーバーログに保存され、リソースマネージャーとトランザクションマネージャーを使用して特定できます。

手作業によるトランザクションのコミットまたはロールバック

一般的に、トランザクションを手作業でコミットまたはロールバックすることはできません。JBoss EAP のトランザクション管理では、トランザクションを自動化リカバリーの保留リストに戻し、再度実行するか記録を削除します。例を以下に示します。

read-resource 操作を使用すると、トランザクションの参加者の状態を確認することができます。

/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:read-resource

結果は以下のようになります。

{
   "outcome" => "success",
   "result" => {
       "eis-product-name" => "ArtemisMQ",
       "eis-product-version" => "2.0",
       "jndi-name" => "java:/JmsXA",
       "status" => "HEURISTIC_HAZARD",
       "type" => "/StateManager/AbstractRecord/XAResourceRecord"
   }
}

この結果の状態は HEURISTIC_HAZARD で、リカバリーの対象となります。

HEURISTIC_HAZARD 例外のリカバリー

以下の手順は、hazard タイプのヒューリスティックの結果をリカバリーする方法の例になります。

  1. リカバリーを開始するには、各リソースマネージャーを確認し、トランザクションマネージャーのツールから特定可能なさまざまなブランチの結果を確立する必要があります。しかし、リソースマネージャーによるコミットまたはロールバックを強制する必要はありません。リソースマネージャーを確認し、ヒューリスティックな例外の状態を認識してください。

    以下はさまざまなリソースマネージャーのヒューリスティックな結果をリストおよび解決するための参照リンクになります。

    注記

    これらのリンクは、参照のみを目的としており、変更する可能性があります。詳細はベンダーのドキュメントを参照してください。

  2. 以下の例が示すように、recover 操作を実行する必要があります。

    /subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover

    recover 操作を実行すると、トランザクションの状態が PREPARE に変更され、commit 操作を再実行してリカバリーが試行されます。リカバリーが正常に試行されると、参加者はトランザクションログから削除されます。

    これを検証するには、再度 log-store 要素で probe 操作を実行します。参加者がリストされていないことを確認できるはずです。最後の参加者が削除されると、トランザクションも削除されます。

HEURISTIC_ROLLBACK および HEURISTIC_COMMIT 例外のリカバリー

ヒューリスティックな結果が rollback タイプである場合、以下を行います。

  • リソースマネージャーが適切に実装されていれば、リソースはトランザクションをコミットできません。
  • 残りのトランザクションを正常にコミットし、トランザクションストアから消去するために、forget 呼び出しを使用してリソースマネージャーからブランチを削除するべきかどうかを決定する必要があります。
  • リソースマネージャーからブランチを削除しない場合は、トランザクションは永遠にトランザクションストアに保存されます。

しかし、ヒューリスティックな結果が commit タイプであった場合、ビジネスセマンティックを使用して一貫性のない結果に対応する必要があります。

手動調整に失敗した場合の追加手順

データベーストランザクションテーブルをチェックできます。これは、Oracle の DBA_2PC_PENDING テーブルです。しかし、これは特定のリソースマネージャーによって異なります。トランザクションマネージャーは、各リソースマネージャーで確認するブランチを提供することができます。

詳細は、このリソースマネージャーに関するベンダーのドキュメントを確認してください。サードパーティーのリソースマネージャーが問題の原因として疑われる場合は、その提供元とサポートチケットの作成を考慮してください。





Revised on 2019-11-27 13:00:48 CET