5.5. ヒューリスティックな結果のリカバリー
トランザクションの更新をコミットまたはロールバックするために、分散トラザクションの完了段階中にトランザクションリソースが一方的な決定を行うと、ヒューリスティックな完了が発生します。これにより、分散データが不確定な状態のままになる可能性があります。可能性として、ネットワークの障害やリソースのタイムアウトがヒューリスティックな完了の原因となることがあります。ヒューリスティックな完了によって、以下のヒューリスティックな結果の例外の 1 つが発生します。
HEURISTIC_COMMIT
- トランザクションマネージャーがロールバックの実行を決定するとこの例外が発生しますが、すべてのリソースはすでに独自にコミットしています。この場合、一貫して完了しているため、何もする必要はありません。
HEURISTIC_ROLLBACK
-
この例外は、トランザクションマネージャーからのコミットの決定が遅れたため、リソースがすべてロールバックしたことを意味します。一貫して完了しているため、
HEURISTIC_COMMIT
と同様に何もする必要はありません。 HEURISTIC_HAZARD
- この例外は、更新の一部の処理が不明であるため発生します。不明なものはすべてコミットまたはロールバックされています。
HEURISTIC_MIXED
- この例外は、トランザクションの一部がロールバックされ、残りの部分がコミットされると発生します。
この手順では、Jakarta Transactions を使用してトランザクションのヒューリスティックな結果を処理する方法を説明します。
トランザクションのヒューリスティックな結果の原因は、リソースマネージャーがコミットまたはロールバックの実行を約束したにも関わらず、約束を守らなかったことにあります。原因としては、サードパーティーコンポーネント、サードパーティーコンポーネントと JBoss EAP 間の統合レイヤー、または JBoss EAP 自体の問題が考えられます。
ヒューリスティックなエラーの最も一般的な 2 つの原因は、環境での一時的な障害と、リソースマネージャー対応時のコーディングエラーです。
通常、環境内で一時的な障害が発生した場合は、ヒューリスティックなエラーを発見する前に気づくはずです。原因としては、ネットワークの停止、ハードウェア障害、データベース障害、電源異常などが考えられます。
ストレステストの実施中にテスト環境でヒューリスティックな結果が発生した場合は、テスト環境の脆弱性を意味します。
警告JBoss EAP は、障害発生時にヒューリスティックな状態ではないトランザクションを自動的にリカバリーしますが、ヒューリスティックなトランザクションのリカバリーは実行しません。
環境に明白な障害が発生していない場合や、ヒューリスティックな結果を簡単に再現できる場合は、おそらくコーディングエラーが原因です。サードパーティーベンダーに連絡して解決策があるかどうかを確認する必要があります。
JBoss EAP のトランザクションマネージャー自体に問題があることを疑う場合は、サポートチケットを作成する必要があります。
- 管理 CLI を使用して手動によるトランザクションのリカバリーを試すことができます。トランザクションを手作業でリカバリーする手順は、トランザクション参加者のリカバリー を参照してください。
トランザクションの結果を手作業で解決する処理は、障害の正確な状況によって異なります。環境に合わせて以下の手順を実行します。
- 関係しているリソースマネージャーを特定します。
- トランザクションマネージャーとリソースマネージャーの状態を調べます。
- 関係するコンポーネントの 1 つまたは複数で、ログの消去とデータの照合を手動で強制します。
テスト環境である場合や、データの整合性を気にしない場合は、トランザクションログを削除して 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
タイプのヒューリスティックの結果をリカバリーする方法の例になります。
リカバリーを開始するには、各リソースマネージャーを確認し、トランザクションマネージャーのツールから特定可能なさまざまなブランチの結果を確立する必要があります。しかし、リソースマネージャーによるコミットまたはロールバックを強制する必要はありません。リソースマネージャーを確認し、ヒューリスティックな例外の状態を認識してください。
以下はさまざまなリソースマネージャーのヒューリスティックな結果をリストおよび解決するための参照リンクになります。
注記これらのリンクは、参照のみを目的としており、変更する可能性があります。詳細はベンダーのドキュメントを参照してください。
- Oracle でのインダウトトランザクションの手動解決
- DB2 でのインダウトトランザクションの手動解決
- PostGreSQL での 2 フェーズコミットの 準備済みトランザクション、コミット、ロールバック
- MySQL での XA トランザクション実装
- MariaDB での XA トランザクション実装
以下の例が示すように、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
テーブルです。しかし、これは特定のリソースマネージャーによって異なります。トランザクションマネージャーは、各リソースマネージャーで確認するブランチを提供することができます。
詳細は、このリソースマネージャーに関するベンダーのドキュメントを確認してください。サードパーティーのリソースマネージャーが問題の原因として疑われる場合は、その提供元とサポートチケットの作成を考慮してください。
改訂日時: 2024-02-08