12.8. XA 数据源恢复
XA 数据源是可参与 XA 全局交易的数据源,由交易经理协调,并可在单个交易中跨越多个资源。如果其中一位参与者未能提交更改,则其他参与者中止交易并恢复交易发生前的状态。这是为了保持一致性,避免潜在的数据丢失或损坏。
XA 恢复是一个确保更新或回滚受交易影响的所有资源的过程,即使任何资源或交易参与者崩溃或不可用。XA 恢复发生,无需用户干预。
每个 XA 资源都需要关联一个恢复模块及其配置。恢复模块是执行恢复时执行的代码。JBoss EAP 自动注册 JDBC XA 资源的恢复模块。如果要实施自定义恢复代码,您可以使用 XA 数据源注册自定义模块。恢复模块必须扩展类 com.arjuna.ats.jta.recovery.XAResourceRecovery
。
12.8.1. 配置 XA 恢复 复制链接链接已复制到粘贴板!
对于大多数 JDBC 资源,恢复模块自动与资源关联。在这些情况下,您只需要配置允许恢复模块连接到资源以执行恢复的选项。
下表描述了特定于 XA 恢复的 XA 数据源参数。这些配置属性可以在数据源创建期间或之后设置。您可以使用管理控制台或管理 CLI 进行设置。有关配置 XA 数据源的详情,请参阅修改 XA 数据源。
属性 | 描述 |
---|---|
restore-username | 用于连接资源以进行恢复的用户名。请注意,如果没有指定,将使用数据源安全设置。 |
restore-password | 用于连接资源以进行恢复的密码。请注意,如果没有指定,将使用数据源安全设置。 |
recovery-security-domain | 用于连接资源以进行恢复的安全域。 |
recovery-plugin-class-name |
如果需要使用自定义恢复模块,将此属性设置为模块的完全限定类名称。模块应扩展类 |
restore-plugin-properties |
如果您使用需要设置属性的自定义恢复模块,请将此属性设置为属性的逗号分隔 |
禁用 XA 恢复
如果多个 XA 数据源连接到同一物理数据库,则通常只需要为其中一个配置 XA 恢复。
使用以下命令来禁用 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)
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;
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 javax.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 javax.transaction.xa.XAException, XAException.XAER_RMERR
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
sp_configure 'enable xact coordination', 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 事务。