13.7. XA 数据源恢复
XA 数据源可以参与 XA 全局事务,它由事务管理器协调,并可跨越单个事务中的多个资源。如果某一参与者未能提交其更改,其他参与者将中止事务并恢复其在交易发生前的状态。这是为了保持一致性,避免潜在的数据丢失或损坏。
XA 恢复是确保受事务影响的所有资源都已更新或回滚,即使任何资源或交易参与者崩溃或不可用。XA 恢复在没有用户干预的情况下发生。
每个 XA 资源都需要有一个与其配置关联的恢复模块。恢复模块是执行恢复时执行的代码。JBoss EAP 自动为 JDBC XA 资源注册恢复模块。如果要实施自定义恢复代码,您可以使用 XA 数据源注册自定义模块。恢复模块必须扩展类 com.arjuna.ats.jta.recovery.XAResourceRecovery
。
13.7.1. 配置 XA 恢复
对于大多数 JDBC 资源,恢复模块会自动与资源关联。在这些情况下,您只需要配置允许恢复模块连接到资源的选项来执行恢复。
下表描述了特定于 XA 恢复的 XA 数据源参数。这些配置属性可以在数据源创建期间或之后设置。您可以使用管理控制台或管理 CLI 设置它们。有关配置 XA 数据源的信息,请参阅修改 XA 数据源。
属性 | 描述 |
---|---|
recovery-username | 用于连接到资源以恢复的用户名。请注意,如果没有指定,则使用数据源安全设置。 |
recovery-password | 用于连接到资源进行恢复的密码。请注意,如果没有指定,则使用数据源安全设置。 |
recovery-security-domain | 用于连接到资源进行恢复的安全域。 |
recovery-plugin-class-name |
如果您需要使用自定义恢复模块,请将此属性设置为模块的完全限定类名称。该模块应扩展类 |
recovery-plugin-properties |
如果您使用需要设置属性的自定义恢复模块,请将此属性设置为属性的以逗号分隔的 |
禁用 XA 恢复
如果多个 XA 数据源连接到同一物理数据库,则通常只需要为其中一个物理数据库配置 XA 恢复。
使用以下管理 CLI 命令禁用 XA 数据源的恢复:
/subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME:write-attribute(name=no-recovery,value=true)
13.7.2. 特定于供应商的 XA 恢复
特定于供应商的配置
有些数据库需要特定的配置,才能在由 JBoss EAP 事务管理器管理的 XA 事务中进行协作。有关详情和最新信息,请查看您的数据库厂商的文档。
- MySQL
- 不需要特殊配置。如需更多信息,请参阅 MySQL 文档。
- PostgreSQL 和 Postgres Plus 高级服务器
-
要使 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 coordination
参数启用或禁用适应服务器事务协调服务。启用此参数后,Adaptive Server 可确保更新远程适应服务器数据提交或回滚原始事务。要启用事务协调,请使用:
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 高级服务器
当 2PC 的提交阶段发生网络故障时,JDBC 驱动程序会返回
XAER_RMERR
XAException 错误代码。此错误向事务管理器发送不可恢复的灾难性事件,但事务在数据库端处于in-doubt
状态,并可以在再次建立网络连接后轻松更正。正确的返回代码应为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 错误代码。此错误向事务管理器发送不可恢复的灾难性事件,但事务在数据库端处于in-doubt
状态,并可以在再次建立网络连接后轻松更正。正确的返回代码应为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 错误代码。此错误向事务管理器发送不可恢复的灾难性事件,但事务在数据库端处于in-doubt
状态,并可以在再次建立网络连接后轻松更正。正确的返回代码应为XAER_RMFAIL
或XAER_RETRY
。错误代码会导致事务保留在 JBoss EAP 端的Heuristic
状态,并在数据库中保存锁定,这需要人工干预。如果使用一次性提交优化时连接失败,JDBC 驱动程序会返回
XAER_RMERR
,但应该返回XAER_RMFAIL
错误代码。如果在一次性提交期间数据库提交数据并且连接在该时间停机时,这可能会导致数据不一致,然后通知客户端已回滚事务。- MariaDB
- MariaDB 无法完全能够处理 XA 事务。如果客户端与 MariaDB 断开连接,则有关此类事务的所有信息都将丢失。