12.8.2. ベンダー固有の XA リカバリー
ベンダー固有の設定
一部のデータベースは、JBoss EAP トランザクションマネージャーによって管理される XA トランザクションに対応するために特定の設定が必要になります。詳細な最新情報については、データベースベンダーの資料を参照してください。
- MySQL
- 特別な設定は必要ありません。詳細は MySQL のドキュメントを参照してください。
自動化された XA リカバリーの場合には、MySQL 8 以降では特別な設定が必要です。詳細は、JBoss EAP 7.4 でサポートされる設定 を参照してください。
- PostgreSQL および Postgres Plus Advanced Server
-
PostgreSQL による XA トランザクションの処理を可能にするには、
max_prepared_transactions
設定パラメーターを0
よりも大きい値またはmax_connections
以上の値に変更します。 - Oracle
必ず Oracle ユーザー
USER
がリカバリーに必要なテーブルにアクセスできるようにしてください。GRANT SELECT ON sys.dba_pending_transactions TO USER; GRANT SELECT ON sys.pending_trans$ TO USER; GRANT SELECT ON sys.dba_2pc_pending TO USER; GRANT EXECUTE ON sys.dbms_xa TO USER;
Oracle ユーザーに適切なパーミッションがないと、以下のようなエラーが表示される可能性があります。
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
- Microsoft SQL Server
- 詳細は、http://msdn.microsoft.com/en-us/library/aa342335.aspx を含む Microsoft SQL Server のドキュメントを参照してください。
- IBM DB2
- 特別な設定は必要ありません。詳細は IBM DB2 のドキュメントを参照してください。
- Sybase
Sybase は、XA トランザクションがデータベース上で有効であることを想定します。XA トランザクションはデータベース設定が正しくないと動作しません。
enable xact coordination
パラメーター は、Adaptive Server トランザクションコーディネーションサービスを有効または無効にします。このパラメーターを有効にすると、リモート Adaptive Server データの更新が、確実に元のトラザクションでコミットまたはロールバックされるようになります。トラザクションコーディネーションを有効にするには、以下を使用します。
sp_configure 'enable xact coordination', 1
- MariaDB
- 特別な設定は必要ありません。詳細は MariaDB のドキュメントを参照してください。
既知の問題
ここで取り上げる既知の問題は、JBoss EAP 7 でサポートされる特定のデータベースおよび JDBC ドライバーバージョンの XA トランザクションの処理に関する問題になります。サポートされるデータベースの最新情報は、JBoss Enterprise Application Platform (EAP) 7 でサポートされる設定 を参照してください。
- MySQL
- MySQL は XA トランザクションを完全に処理できません。クライアントと MySQL の接続が切断されると、トランザクションに関する情報がすべて失われます。詳細は MySQL のバグ を参照してください。この問題は MuSQL 5.7 で修正されました。
- PostgreSQL および Postgres Plus Advanced Server
2 フェーズコミット (2PC) のコミットフェーズ中にネットワークの障害が発生すると、JDBC ドライバーによって
XAER_RMERR
XAException エラーコードが返されます。このエラーは、トランザクションマネージャーでリカバリー不可能な重大なイベントが発生したことを示しますが、トランザクションはデータベース側でin-doubt
状態を維持し、ネットワーク接続の回復後に簡単に修正できます。適切な戻りコードはXAER_RMFAIL
またはXAER_RETRY
になります。誤ったエラーコードにより、トランザクションが JBoss EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、手動の介入が必要になります。詳細は PostgreSQL のバグ を参照してください。1 フェーズコミットの最適化が使用されたときに接続の障害が発生した場合、JDBC ドライバーは
XAER_RMERR
を返しますが、適切な戻りコードはXAER_RMFAIL
になります。そのため、1 フェーズコミット中にデータベースがデータをコミットし、同時に接続が切断されると、クライアントにはトラザクションがロールバックされたと伝えられるため、データの不整合が発生する場合があります。Postgres Plus JDBC ドライバーは、Postgres Plus Server に存在するすべての準備済みトランザクションの XID を返すため、XID が属するデータベースを判断する方法がありません。JBoss EAP で複数のデータソースを同じデータベースに定義すると、in-doubt トランザクションリカバリーが誤ったアカウントで実行される可能性があります。 この場合、リカバリーに失敗します。
- Oracle
一部のユーザー認証情報で設定されたデータソースを使用してリカバリーマネージャーがリカバリーを呼び出すと、JDBC ドライバーはデータベースインスタンスのすべてのユーザーに属する XID を返します。JDBC ドライバーは他のユーザーに属する XID をリカバリーしようとするため、例外
ORA-24774: cannot switch to specified transaction
が発生します。この問題を回避するには、リカバリーデータソース設定で認証情報が使用されるユーザーに
FORCE ANY TRANSACTION
権限を付与します。特権の設定に関する詳細は http://docs.oracle.com/database/121/ADMIN/ds_txnman.htm#ADMIN12259 を参照してください。- Microsoft SQL Server
2 フェーズコミット (2PC) のコミットフェーズ中にネットワークの障害が発生すると、JDBC ドライバーによって
XAER_RMERR
XAException エラーコードが返されます。このエラーは、トランザクションマネージャーでリカバリー不可能な重大なイベントが発生したことを示しますが、トランザクションはデータベース側でin-doubt
状態を維持し、ネットワーク接続の回復後に簡単に修正できます。適切な戻りコードはXAER_RMFAIL
またはXAER_RETRY
になります。誤ったエラーコードにより、トランザクションが JBoss EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、手動の介入が必要になります。詳細は Microsoft SQL Server の問題レポート を参照してください。1 フェーズコミットの最適化が使用されたときに接続の障害が発生した場合、JDBC ドライバーは
XAER_RMERR
を返しますが、適切な戻りコードはXAER_RMFAIL
になります。そのため、1 フェーズコミット中にデータベースがデータをコミットし、同時に接続が切断されると、クライアントにはトラザクションがロールバックされたと伝えられるため、データの不整合が発生する場合があります。- IBM DB2
-
1 フェーズコミット中に接続の障害が発生した場合、JDBC ドライバーは
XAER_RMERR
を返しますが、適切な戻りコードはXAER_RMFAIL
です。そのため、1 フェーズコミット中にデータベースがデータをコミットし、同時に接続が切断されると、クライアントにはトラザクションがロールバックされたと伝えられるため、データの不整合が発生する場合があります。 - Sybase
2 フェーズコミット (2PC) のコミットフェーズ中にネットワークの障害が発生すると、JDBC ドライバーによって
XAER_RMERR
XAException エラーコードが返されます。このエラーは、トランザクションマネージャーでリカバリー不可能な重大なイベントが発生したことを示しますが、トランザクションはデータベース側でin-doubt
状態を維持し、ネットワーク接続の回復後に簡単に修正できます。適切な戻りコードはXAER_RMFAIL
またはXAER_RETRY
になります。誤ったエラーコードにより、トランザクションが JBoss EAP 側でHeuristic
状態のままになり、データベースでロックが保持されるため、手動の介入が必要になります。1 フェーズコミットの最適化が使用されたときに接続の障害が発生した場合、JDBC ドライバーは
XAER_RMERR
を返しますが、適切な戻りコードはXAER_RMFAIL
になります。そのため、1 フェーズコミット中にデータベースがデータをコミットし、同時に接続が切断されると、クライアントにはトラザクションがロールバックされたと伝えられるため、データの不整合が発生する場合があります。Sybase トランザクションブランチが準備済み状態になる前に、Sybase 15.7 または 16 データベースへの挿入が含まれる XA トランザクションが失敗すると、XA トランザクションの繰り返しや同じ主キーでの同じレコードの挿入に失敗し、エラー
com.sybase.jdbc4.jdbc.SybSQLException: Attempt to insert duplicate key row
が発生します。この例外は、元の終了していない Sybase トランザクションブランチがロールバックするまで発生します。- MariaDB
- MariaDB は XA トランザクションを完全に処理できません。クライアントと MariaDB の接続が切断されると、トランザクションに関する情報がすべて失われます。
- MariaDB Galera クラスター
- MariaDB Galera クラスターでは XA トランザクションはサポートされません。