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 数据源。

Expand
表 11.2. XA 恢复的数据源参数
属性描述

recovery-username

用于连接到恢复的资源的用户名。请注意,如果没有指定,则使用数据源安全设置。

recovery-password

用于连接到恢复的资源的密码。请注意,如果没有指定,则使用数据源安全设置。

recovery-security-domain

用于连接到恢复的资源的安全域。

recovery-plugin-class-name

如果您需要使用自定义恢复模块,请将此属性设置为模块的完全限定域名。模块应该扩展类 com.arjuna.ats.jta.recovery.XAResourceRecovery

recovery-plugin-properties

如果您使用需要设置属性的自定义恢复模块,请将此属性设置为属性以逗号分隔的 KEY=VALUE 对的列表。

禁用 XA 恢复

如果多个 XA 数据源连接到同一物理数据库,则通常只需要为其中一个物理数据库配置 XA 恢复。

使用以下管理 CLI 命令,为 XA 数据源禁用恢复:

/subsystem=datasources/xa-data-source=XA_DATASOURCE_NAME:write-attribute(name=no-recovery,value=true)
Copy to Clipboard Toggle word wrap

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;
Copy to Clipboard Toggle word wrap

如果 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
Copy to Clipboard Toggle word wrap
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
Copy to Clipboard Toggle word wrap
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_RMERR XAException 错误代码。这个错误向事务管理器发送不可恢复的灾难事件,但事务在数据库端处于 in-doubt 状态,并可在再次建立网络连接后轻松纠正。正确的返回代码应为 XAER_RMFAILXAER_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_RMERR XAException 错误代码。这个错误向事务管理器发送不可恢复的灾难事件,但事务在数据库端处于 in-doubt 状态,并可在再次建立网络连接后轻松纠正。正确的返回代码应为 XAER_RMFAILXAER_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_RMFAILXAER_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 事务。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat