6.4.4.2. XA リカバリーモジュールの設定
ほとんどの JDBC および JMS リソースでは、リカバリーモジュールはリソースに自動的に関連付けられます。この場合は、リカバリーモジュールがリソースに接続してリカバリーを実行することを許可するオプションのみを設定する必要があります。
JDBC または JMS でないカスタムリソースの場合は、サポートされる設定について Red Hat グローバルサポートサービスにお問い合わせください。
これらの設定属性はデータソースの作成時または作成後に設定できます。Web ベースの管理コンソールまたはコマンドライン管理 CLI を使用して設定できます。XA データソースの設定に関する一般的な情報は、「管理インターフェースによる XA データソースの作成」 および 「管理インターフェースによる XA データソースの編集」 を参照してください。
一般的なデータソース設定属性と、特定のデータベースベンダーに関連する設定詳細については、以下の表を参照してください。
属性 | 説明 |
---|---|
recovery-username |
リソースに接続してリカバリー行うためにリカバリーモジュールが使用する必要があるユーザー名。
|
recovery-password |
リソースに接続してリカバリーを行うためにリカバリーモジュールが使用する必要があるパスワード。
|
recovery-security-domain |
リカバリーを行う目的でリカバリーモジュールがリソースに接続するために使用するセキュリティードメイン。
|
recovery-plugin-class-name |
カスタムのリカバリーモジュールを使用する必要がある場合は、この属性をモジュールの完全修飾クラス名に設定します。モジュールはクラス
com.arjuna.ats.jta.recovery.XAResourceRecovery を拡張する必要があります。
|
recovery-plugin-properties |
プロパティーを設定する必要があるカスタムのリカバリーモジュールを使用する場合は、この属性をプロパティーのコンマ区切りの key=value ペアのリストに設定します。
|
注記
表6.2「一般的な設定属性」 で使用される名前は、データソースが CLI で設定されている場合に使用されるパラメーターです。XML 設定ファイルで使用される名前とは異なる場合があります。
ベンダー固有の設定情報
ここでは、特定のデータベースが JBoss EAP トランザクションマネージャーによって管理される XA トランザクションで連携するのに必要な特定の設定について説明します。詳細は、特定のデータベースのドキュメントを参照してください。
- Oracle
- Oracle データソースが不適切に設定された場合は、ログ出力に次のようなエラーが示されることがあります。
例6.11 誤った設定エラー
WARN [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR
このエラーを解決するには、recovery-username
で設定した Oracle ユーザーがリカバリーに必要なテーブルにアクセスできるようにします。以下の SQL ステートメントは、Oracle バグ 5945463 にパッチが適用された Oracle 11g または Oracle 10g R2 インスタンスに対する適切な付与を示しています。例6.12 付与の設定
GRANT SELECT ON sys.dba_pending_transactions TO recovery-username; GRANT SELECT ON sys.pending_trans$ TO recovery-username; GRANT SELECT ON sys.dba_2pc_pending TO recovery-username; GRANT EXECUTE ON sys.dbms_xa TO recovery-username;
11g より前の Oracle 11 バージョンを使用している場合は、最終的なEXECUTE
ステートメントを以下のように変更します。GRANT EXECUTE ON sys.dbms_system TO recovery-username;
- PostgreSQL および Postgres Plus Advanced Server
- PostgreSQL が XA トランザクションを処理できるようにするには、設定パラメーター
max_prepared_transactions
を 0 よりも大きな値に変更します。 - MySQL
- 特別な設定は必要ありません。詳細は MySQL のドキュメントを参照してください。
- IBM DB2
- 特別な設定は必要ありません。詳細は IBM DB2 のドキュメントを参照してください。
- Sybase
- Sybase は、XA トランザクションがデータベース上で有効であることを想定します。XA トランザクションはデータベース設定が正しくないと動作しません。
xact コーディネーションを有効
にすると、Adaptive Server トランザクションコーディネーションサービスを有効または無効にします。このパラメーターを有効にすると、リモート Adaptive Server データのアップデートが、確実に元のトラザクションでコミットまたはロールバックされるようになります。トラザクションコーディネーションを有効にするには、以下を使用します。sp_configure 'enable xact coordination', 1
. - MSSQL
- 詳細は Microsoft ドキュメントを参照してください。また、開始点として参照 http://msdn.microsoft.com/en-us/library/aa342335.aspx することもできます。
ベンダー固有の問題とその結果
ここでは、XA トランザクションの処理に現在既知のデータベース固有の問題を説明します。これらの問題は、特定の EAP バージョンで現在対応しているデータベースバージョンおよび jdbc ドライバーを指します。
- Oracle
- データベースに関連する既知の問題はありません。
- PostgreSQL
- コミットメソッドプロトコルの呼び出し中にエラーが発生した場合、JDBC ドライバーは XAER_RMERR を返します。データベースはこのエラーコードを返し、トランザクションをデータベース側
でインダウト
状態のままにします。正しい戻りコードは XAER_RMFAIL または XAER_RETRY である必要があります。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/236。これにより、トランザクションは EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、ユーザーの介入が必要になります。 - jdbc ドライバーによって返される誤ったエラーコードにより、場合によってはデータの不整合が発生する可能性があります。詳細は、を参照して https://developer.jboss.org/thread/251537 ください。 https://github.com/pgjdbc/pgjdbc/issues/236
- Postgres Plus Advanced Server
- コミットメソッドプロトコルの呼び出し中にエラーが発生した場合、JDBC ドライバーは XAER_RMERR を返します。データベースはこのエラーコードを返し、トランザクションをデータベース側
でインダウト
状態のままにします。正しい戻りコードは XAER_RMFAIL または XAER_RETRY である必要があります。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/236。これにより、トランザクションは EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、ユーザーの介入が必要になります。 - jdbc ドライバーによって返される誤ったエラーコードにより、場合によってはデータの不整合が発生する可能性があります。詳細は以下を参照してください。 https://developer.jboss.org/thread/251537
- 同じ XID に対して
XAResource.rollback
が呼び出されると、XAException
がスローされます。同じ XID に対するロールバックを複数回呼び出しても JTS 仕様に準拠し、XAException
はスローされません。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/78。
- MySQL
- MySQL は XA トランザクションを処理できません。クライアントが MySQL を切断されると、このようなトランザクションに関する情報がすべて失われます。詳細はを参照してください http://bugs.mysql.com/bug.php?id=12161。
- IBM DB2
- データベースに関連する既知の問題はありません。
- Sybase
- コミットメソッドプロトコルの呼び出し中にエラーが発生した場合、JDBC ドライバーは XAER_RMERR を返します。データベースはこのエラーコードを返し、トランザクションをデータベース側
でインダウト
状態のままにします。正しい戻りコードは XAER_RMFAIL または XAER_RETRY である必要があります。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/236。これにより、トランザクションは EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、ユーザーの介入が必要になります。 - 同じ XID に対して
XAResource.rollback
が呼び出されると、XAException
がスローされます。同じ XID に対するロールバックを複数回呼び出しても JTS 仕様に準拠し、XAException
はスローされません。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/78。
- MSSQL
- コミットメソッドプロトコルの呼び出し中にエラーが発生した場合、JDBC ドライバーは XAER_RMERR を返します。データベースはこのエラーコードを返し、トランザクションをデータベース側
でインダウト
状態のままにします。正しい戻りコードは XAER_RMFAIL または XAER_RETRY である必要があります。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/236。これにより、トランザクションは EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、ユーザーの介入が必要になります。 - 同じ XID に対して
XAResource.rollback
が呼び出されると、XAException
がスローされます。同じ XID に対するロールバックを複数回呼び出しても JTS 仕様に準拠し、XAException
はスローされません。詳細はを参照してください https://github.com/pgjdbc/pgjdbc/issues/78。 - 同じ XID の
XAResource.rollback
の呼び出しにより、サーバーログファイルに以下のメッセージが記録されます。WARN [com.arjuna.ats.jtax] ...: XAResourceRecord.rollback caused an error from resource ... in transaction ...: java.lang.NullPointerException
- Messaging
IBM Web Warehouse
- JTS を使用する場合、定期的なリカバリー時に同じ XID に対するロールバックの 2 回目の呼び出しにより、エラーがログファイルに記録される可能性があります。同じ XID に対する 2 回目のロールバックは JTS の構成であり、無視できます。RAR がこのような XID が分からない場合は、XAER_NOTA の戻りコードが予想されます。ただし、IBM Web Warehouse は誤った戻りコード XAER_RMFAIL を返す可能性があります。
The method 'xa_rollback' has failed with errorCode '-7' due to the resource being closed.'
ActiveMQ
- コミットメソッドプロトコルの呼び出し中にエラーが発生した場合(ネットワークの切断など)は、XAER_RMERR を返します。リソースアダプターはこのエラーコードをトランザクションマネージャーに戻し、メッセージブローカー側でトランザクションが
インダウト
状態のままになります。この動作は XA 仕様に対して行われ、正しい戻りコードは XAER_RMFAIL または XAER_RETRY である必要があります。誤ったエラーコードにより、場合によってはデータの不整合が発生する可能性があります。詳細は、を参照して https://developer.jboss.org/thread/251537 ください。WARN [com.arjuna.ats.jtax] ...: XAResourceRecord.rollback caused an XA error: ARJUNA016099: Unknown error code:0 from resource ... in transaction ...: javax.transaction.xa.XAException: Transaction ... has not been started.
TIBCO
- JTS を使用する場合、定期的なリカバリー時に同じ XID に対するロールバックの 2 回目の呼び出しにより、エラーがログファイルに記録される可能性があります。同じ XID に対する 2 回目のロールバックは JTS の構成であり、無視できます。
WARN [com.arjuna.ats.jtax] ...: XAResourceRecord.rollback caused an XA error: XAException.XAER_RMFAIL from resource ... in transaction ...: javax.transaction.xa.XAException