12.8.2. 特定于厂商的 XA 恢复
特定厂商配置
些数据库需要特定的配置,才能在由 JBoss EAP 事务管理器管理的 XA 交易中协作。有关详细信息和最新信息,请查看您的数据库供应商文档。
- MySQL
- 不需要特殊配置。如需更多信息,请参阅 MySQL 文档。
- 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
- 如需更多信息,请参阅 Microsoft SQL Server 文档,包括 http://msdn.microsoft.com/en-us/library/aa342335.aspx。
- IBM DB2
- 不需要特殊配置。如需更多信息,请参阅 IBM DB2 文档。
- Sybase
Sybase 希望在数据库中启用 XA 事务。如果没有正确的数据库配置,XA 事务将无法工作。
enable xact 协调
参数启用或禁用自适应服务器事务协调服务。启用此参数后,自适应服务器服务器可确保对远程适配器服务器数据提交或回滚原始事务的更新。要启用事务协调,请使用:
sp_configure 'enable xact coordination', 1
- MariaDB
- 不需要特殊配置。如需更多信息,请参阅 MariaDB 文档。
已知问题
这些处理 XA 事务的已知问题与 JBoss EAP 7 支持的特定数据库和 JDBC 驱动程序版本有关。有关支持的数据库的最新信息,请参阅 JBoss EAP 支持的配置。
- MySQL
- MySQL 无法完全处理 XA 事务。如果客户端与 MySQL 断开连接,则此类交易的所有信息都将丢失。如需更多信息,请参阅此 MySQL 错误。请注意,这个问题已在 MySQL 5.7 中解决。
- PostgreSQL 和 Postgres Plus Advanced Server
当两阶段提交(2PC)的提交阶段发生网络故障时,JDBC 驱动程序会返回
XAER_RMERR
XAException 错误代码。此错误向交易管理器表明一个无法恢复的灾难性事件,但事务保留在数据库端的 indoubt
状态,并在网络连接再次建立后易于更正。正确的返回代码应当是XAER_RMFAIL 或
XAER_RETRY
。错误代码不正确会导致事务保持在 JBoss EAP 侧的Heuristic
状态,并在数据库中锁定需要人工干预。如需更多信息,请参阅此 PostgreSQL 错误。如果使用单阶段提交优化时发生连接失败,JDBC 驱动程序将返回
XAER_RMERR
,但应当返回XAER_RMFAIL
错误代码。如果数据库在一阶提交期间提交数据并且连接在停机时中断,这可能会导致数据不一致,然后客户端被通知事务被回滚。Postgres Plus JDBC 驱动程序为 Postgres Plus Server 中存在的所有准备事务返回 XID,因此无法确定 XID 所属的数据库。如果您在 JBoss EAP 中为同一数据库定义多个数据源,则内部事务恢复尝试可能会在错误的帐户下运行,这会导致恢复失败。
- Oracle
当恢复管理器使用配置了一些用户凭据的数据源调用恢复时,JDBC 驱动程序会返回属于数据库实例上所有用户的 XID。JDBC 驱动程序抛出异常
ORA-24774:无法切换到指定的事务
,因为它试图恢复属于其他用户的 XID。这个问题的解决方法是向在恢复数据源配置中使用凭证的用户授予
FORCE ANY TRANSACTION
特权。有关配置权限的更多信息,请参阅 http://docs.oracle.com/database/121/ADMIN/ds_txnman.htm#ADMIN12259- Microsoft SQL Server
当两阶段提交(2PC)的提交阶段发生网络故障时,JDBC 驱动程序会返回
XAER_RMERR
XAException 错误代码。此错误向交易管理器表明一个无法恢复的灾难性事件,但事务保留在数据库端的 indoubt
状态,并在网络连接再次建立后易于更正。正确的返回代码应当是XAER_RMFAIL 或
XAER_RETRY
。错误代码不正确会导致事务保持在 JBoss EAP 侧的Heuristic
状态,并在数据库中锁定需要人工干预。如需更多信息,请参阅此 Microsoft SQL Server 问题报告。如果使用单阶段提交优化时发生连接失败,JDBC 驱动程序将返回
XAER_RMERR
,但应当返回XAER_RMFAIL
错误代码。如果数据库在一阶提交期间提交数据并且连接在停机时中断,这可能会导致数据不一致,然后客户端被通知事务被回滚。- IBM DB2
-
如果在单阶段提交期间发生连接失败,JDBC 驱动程序将返回
XAER_RETRY
,但应当返回XAER_RMFAIL
错误代码。如果数据库在一阶提交期间提交数据并且连接在停机时中断,这可能会导致数据不一致,然后客户端被通知事务被回滚。 - Sybase
当两阶段提交(2PC)的提交阶段发生网络故障时,JDBC 驱动程序会返回
XAER_RMERR
XAException 错误代码。此错误向交易管理器表明一个无法恢复的灾难性事件,但事务保留在数据库端的 indoubt
状态,并在网络连接再次建立后易于更正。正确的返回代码应当是XAER_RMFAIL 或
XAER_RETRY
。错误代码不正确会导致事务保持在 JBoss EAP 侧的Heuristic
状态,并在数据库中锁定需要人工干预。如果使用单阶段提交优化时发生连接失败,JDBC 驱动程序将返回
XAER_RMERR
,但应当返回XAER_RMFAIL
错误代码。如果数据库在一阶提交期间提交数据并且连接在停机时中断,这可能会导致数据不一致,然后客户端被通知事务被回滚。如果在 Sybase 事务分支处于就绪状态之前包含插入 Sybase 15.7 或 16 数据库的 XA 事务失败,则重复 XA 事务并插入具有相同主键的相同记录会失败,并出现
com.sybase.jdbc4.jdbc.SybSQLException: Attempt 以插入重复密钥行
。这个异常将被抛出,直到原始的未完成 Sybase 事务分支回滚。- MariaDB
- MariaDB 无法完全处理 XA 事务。如果客户端与 MariaDB 断开连接,则此类交易的所有信息都将丢失。
- MariaDB Galera Cluster
- MariaDB Galera 集群中不支持 XA 事务。