第5章 トランザクションマネージャー例外の処理

5.1. タイムアウトしたトランザクションのデバッグ

トランザクションがタイムアウトする理由は多くあり、以下が含まれることがあります。

  • サーバーのパフォーマンス遅延。
  • 待機によるスレッドのスタック、またはハングアップ。
  • スレッドが処理を完了するのに、設定したトランザクションのタイムアウト時間よりも多くの時間を必要とする。

以下のエラーメッセージのログを確認すると、タイムアウトしたトランザクションを特定できます。

WARN ARJUNA012117 "TransactionReaper::check timeout for TX {0} in state {1}"

{0} はトランザクションの Uid、{1} はトランザクションマネージャーの観点からのタイムアウトしたトランザクションの状態 {1} になります。

トランザクションマネージャーは、トランザクションタイムアウトのデバッグに以下のオプションを提供します。

  • トランザクションのタイムアウト値を設定して、トランザクションのライフタイムを制御できます。コミットまたはロールバックが原因でトランザクションが終了する前にタイムアウト値が経過する場合、transactions サブシステムは transactions をロールバックします。
  • XAResource インターフェースの setTransactionTimeout メソッドを使用すると現在のトランザクションをリソースマネージャーに伝播できます。この操作がサポートされる場合、リソースマネージャーに関連するデフォルトのタイムアウトがオーバーライドされます。タイムアウトのオーバーライドは以下のような状況で役に立ちます。

    • 長期実行されているトランザクションのライフタイムがデフォルトよりも長い場合。
    • デフォルトのタイムアウトを使用すると、トランザクションの終了前にリソースマネージャーがロールバックし、トランザクションもロールバックする原因となる場合。
  • タイムアウト値を指定しなかったり、0 を値として使用すると、トランザクションマネージャーは実装固有のデフォルト値を使用します。JBoss EAP トランザクションマネージャーでは、CoordinatorEnvironmentBean.defaultTimeout プロパティーはこの実装固有のデフォルト値を表します。デフォルト値は 300 秒です。0 を値として指定すると、デフォルトのトランザクションタイムアウトを無効にします。

    以下の管理 CLI コマンドを使用するとデフォルトのトランザクションタイムアウトを変更できます。

    /subsystem=transactions:write-attribute(name=default-timeout,value=VALUE)

    管理対象ドメインで実行している場合、コマンドの前に /profile=PROFILE_NAME を付けて更新するプロファイルを指定する必要があります。

  • JBoss EAP トランザクションマネージャーは、XAResource インスタンスでの setTransactionTimeout メソッドの呼び出しに、すべてか無かの選択をサポートします。JTAEnvironmentBean.xaTransactionTimeoutEnabled プロパティーを true (デフォルト) に設定すると、すべてのインスタンスでメソッドを呼び出しできます。タイムアウトを無効にしてトランザクションごとに設定する場合は、com.arjuna.ats.jta.common.JTAEnvironmentBean クラスの setXATransactionTimeoutEnabled メソッドを使用できます。