11.8. XA 数据源恢复
XA 数据源是可以参与 XA 全局事务的数据源,由事务管理器协调,并可跨越单个事务中的多个资源。如果其中一个参与者无法提交更改,其他参与者将中止事务并在交易发生前恢复其状态。这是为了保持一致性,避免潜在的数据丢失或损坏。
XA 恢复是确保受事务影响的所有资源都已更新或回滚的过程,即使有任何资源或交易参与者崩溃或不可用。XA 恢复在没有用户干预的情况下发生。
每个 XA 资源都需要有一个与其配置关联的恢复模块。恢复模块是在执行恢复时执行的代码。JBoss EAP 自动注册 JDBC XA 资源的恢复模块。如果要实施自定义恢复代码,您可以将自定义模块注册到 XA 数据源。恢复模块必须扩展类 com.arjuna.ats.jta.recovery.XAResourceRecovery。
11.8.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)
/subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME:write-attribute(name=no-recovery,value=true)
11.8.2. 特定于供应商的 XA 恢复 复制链接链接已复制到粘贴板!
特定于供应商的配置
有些数据库需要特定的配置,才能协调由 JBoss EAP 事务管理器管理的 XA 事务。有关详细信息和最新信息,请参阅您的数据库供应商文档。
- MySQL
- 不需要特殊配置。如需更多信息,请参阅 MySQL 文档。
为了自动化 XA 恢复,MySQL 8 及更高版本需要特殊配置。如需更多信息,请参阅 JBoss EAP 8.0 支持的配置。
- 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;
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;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 Oracle 用户没有正确的权限,您可能会看到类似如下的错误:
WARN [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception jakarta.transaction.xa.XAException, XAException.XAER_RMERR
WARN [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception jakarta.transaction.xa.XAException, XAException.XAER_RMERRCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Microsoft SQL Server
- 如需更多信息,请参阅 Microsoft SQL Server 文档,包括 了解 XA 事务。
- IBM DB2
- 不需要特殊配置。如需更多信息,请参阅 IBM DB2 文档。
- Sybase
Sybase 预期在数据库上启用 XA 事务。如果没有正确的数据库配置,XA 事务将无法正常工作。
enable xact coordination参数启用或禁用 Adaptive Server transaction 协调服务。启用此参数后,Astaptive Server 确保更新远程 Adaptive Server 数据提交,或使用原始事务回滚。要启用事务协调,请使用:
sp_configure 'enable xact coordination', 1
sp_configure 'enable xact coordination', 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MariaDB
- 不需要特殊配置。如需更多信息,请参阅 MariaDB 文档。
已知问题
处理 XA 事务的这些已知问题适用于特定的数据库和 JBoss EAP 8.0 支持的 JDBC 驱动程序版本。有关支持的数据库的最新信息,请参阅 JBoss EAP 8.0 支持的配置。
- MySQL
- MySQL 无法完全能够处理 XA 事务。如果客户端与 MySQL 断开连接,则有关此类事务的所有信息都将丢失。如需更多信息,请参阅此 MySQL 错误。请注意,这个问题已在 MySQL 5.7 中解决。
- PostgreSQL 和 Postgres Plus Advanced Server
当网络故障在双阶段提交(2PC)的提交阶段发生时,JDBC 驱动程序会返回
XAER_RMERRXAException 错误代码。这个错误向事务管理器发送不可恢复的灾难事件,但事务在数据库端处于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 中为同一数据库定义了多个数据源,则在错误的帐户下运行 in-doubt 事务恢复尝试,这会导致恢复失败。
- Oracle
当恢复管理器使用配置了某些用户凭证的数据源调用恢复时,JDBC 驱动程序会返回属于数据库实例上的所有用户的 XID。JDBC 驱动程序会抛出异常
ORA-24774: 无法切换到指定的事务,因为它尝试恢复属于其他用户的 XID。这个问题的解决方法是,为在恢复数据源配置中使用凭证的用户授予
FORCE ANY TRANSACTION特权。有关配置特权的更多信息,请参阅 手动覆盖 in-doubt 事务。- Microsoft SQL Server
当网络故障在双阶段提交(2PC)的提交阶段发生时,JDBC 驱动程序会返回
XAER_RMERRXAException 错误代码。这个错误向事务管理器发送不可恢复的灾难事件,但事务在数据库端处于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_RMERRXAException 错误代码。这个错误向事务管理器发送不可恢复的灾难事件,但事务在数据库端处于in-doubt状态,并可在再次建立网络连接后轻松纠正。正确的返回代码应为XAER_RMFAIL或XAER_RETRY。错误错误的错误代码会导致事务在 JBoss EAP 端处于Heuristic状态,并在数据库中保存锁定,这需要人工干预。如果使用单阶段提交优化,如果连接失败,则 JDBC 驱动程序会返回
XAER_RMERR,但应返回XAER_RMFAIL错误代码。如果在一次阶段提交期间数据库提交数据,且连接在此时停机,则这可能会导致数据不一致,然后通知客户端被回滚。如果包含插入到 Sybase 15.7 或 16 数据库的 XA 事务在 Sybase 事务分支处于准备状态之前失败,则重复 XA 事务,并插入具有相同主密钥的相同记录会失败,并显示
com.sybase.jdbc4.jdbc.SybSQLException: Attempt to insert duplicate key 行错误。这个异常会被抛出,直到回滚原始未完成 Sybase 事务分支。- MariaDB
- MariaDB 无法完全能够处理 XA 事务。如果客户端与 MariaDB 断开连接,则有关此类事务的所有信息都将丢失。
- MariaDB Galera 集群
- MariaDB Galera 集群 不支持 XA 事务。