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

表 13.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)

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_RMFAILXAER_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_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 错误代码。如果在一次性提交期间数据库提交数据并且连接在该时间停机时,这可能会导致数据不一致,然后通知客户端已回滚事务。

MariaDB
MariaDB 无法完全能够处理 XA 事务。如果客户端与 MariaDB 断开连接,则有关此类事务的所有信息都将丢失。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.