12.9.4. XA リカバリープロセスの制限
XA リカバリーには以下の制限があります。
- トランザクションログが正常にコミットされたトランザクションから消去されないことがあります。
XAResource
のコミットメソッドが正常に完了し、トランザクションをコミットした後、コーディネーターがログをアップデートできるようになる前に JBoss EAP サーバーがクラッシュした場合、サーバーの再起動時に以下の警告メッセージが表示されることがあります。ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord
これは、リカバリー時に JBoss トランザクションマネージャー はログのトランザクション参加者を確認し、コミットを再試行しようとするからです。最終的に、JBoss Transaction Manager はリソースがコミットされていると想定し、コミットを再試行しなくなります。このような場合、トランザクションはコミットされデータの損失はないため、警告を無視しても問題ありません。警告を防ぐには、com.arjuna.ats.jta.xaAssumeRecoveryCompleteプロパティー値をtrue
に設定します。このプロパティーは、登録されたXAResourceRecovery
インスタンスから新しいXAResource
インスタンスが見つからないとチェックされます。true
に設定すると、リカバリーで、以前のコミットの試行が成功したと見なされ、これ以上リカバリーを試行しなくてもインスタンスをログから削除できます。このプロパティーはグローバルであり、適切に使用しないとXAResource
インスタンスがコミットされていない状態のままになるため、注意して使用する必要があります。- XAResource.prepare() の最後にサーバーがクラッシュすると、JTS トランザクションに対するロールバックは呼び出されません。
XAResource
の完了後に JBoss EAP サーバーがクラッシュした場合prepare()
メソッド呼び出しでは、参加しているすべての XAResources が準備済み状態でロックされ、サーバーの再起動時にその状態が維持されます。トランザクションがタイムアウトするか、DBA が手動でリソースをロールバックしてトランザクションをクリアするまで、トランザクションはロールバックされず、リソースはロックされたままになります。ログ。- 周期リカバリーはコミットされたトランザクションで発生する可能性があります。
- サーバーに過剰な負荷がかかっている場合、サーバーログには以下の警告メッセージとそれに続くスタックトレースが含まれる場合があります。
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException
負荷が大きい場合、トランザクションにかかる処理時間が周期的リカバリープロセスのアクティビティーと重なることがあります。周期的リカバリープロセスは進行中のトランザクションを検出し、ロールバックを開始しようとしますが、トランザクションは完了するまで続行されます。周期的リカバリーはロールバックの開始に失敗し、ロールバックの失敗がサーバーログに記録されます。この問題の根本的な原因は、今後のリリースで修正される予定ですが、現時点では回避方法を使用できます。を設定して、リカバリプロセスの 2 つのフェーズ間の間隔を増やします。com.arjuna.ats.jta.orphanSafetyIntervalプロパティーをデフォルト値の 10000 ミリ秒よりも高い値に設定します。40000 ミリ秒の値が推奨されます。これで問題が解決するわけではなく、発生する可能性が低くなり、警告メッセージがログに表示されることに注意してください。