10.8. 事务恢复
恢复是 XA 事务的一个功能,它处理资源的最终性,甚至是事务管理器失败,并从这种情况进行相应的恢复。
10.8.1. 何时使用恢复
考虑一个分布式交易,其中资金从存储在外部数据库中的帐户转移到 Data Grid 中存储的帐户。当调用 TransactionManager.commit ()
时,两个资源都会成功准备(1st 阶段)。在提交(2nd)阶段,数据库在从事务管理器接收提交请求前成功应用更改 whilst Data Grid 失败。此时系统处于不一致的状态:从外部数据库中的帐户获得资金,但还没有在 Data Grid (因为锁定仅在双阶段提交协议的 2nd 阶段发布)。恢复处理这种情况,以确保数据库和数据网格都处于一致状态。
10.8.2. 它如何工作
恢复由事务管理器协调。事务管理器与 Data Grid 合作,以确定需要人工干预并告知系统管理员(通过电子邮件、日志警报等)的异常事务列表。这个过程是特定于事务管理器的,但通常需要在事务管理器中进行一些配置。
知道 in-doubt 事务 ID,系统管理员现在可以连接到 Data Grid 集群,并重播事务提交或强制回滚。Data Grid 提供 JMX 工具 - 这在 Transaction recovery and reconciliation 部分中进行了广泛阐述。
10.8.3. 配置恢复
Data Grid 中不默认启用恢复。如果禁用,TransactionManager
将无法与 Data Grid 一起使用,以确定 in-doubt 事务。Transaction configuration 部分演示了如何启用它。
注意: recovery-cache
属性不是强制的,它被配置为每个缓存。
若要恢复工作,必须将 mode
设置为 FULL_XA
,因为需要全线 XA 事务。
10.8.3.1. 启用 JMX 支持
为了可以使用 JMX 管理恢复支持,必须明确启用。
10.8.4. 恢复缓存
为了跟踪新的交易并能够回复它们,数据网格会缓存所有事务,供未来使用。这个状态仅为 in-doubt 事务保存,在提交/滚动阶段完成后,会删除成功完成事务。
这种不疑的交易数据保存在本地缓存中:这样,在它太大时,可以通过缓存加载程序将这些信息交换到磁盘。此缓存可以通过 recovery-cache
配置属性指定。如果没有指定 Data Grid,则会为您配置本地缓存。
(尽管强制)可以在启用了恢复的所有 Data Grid 缓存之间共享相同的恢复缓存。如果覆盖默认恢复缓存,则指定的恢复缓存必须使用 TransactionManagerLookup,它返回一个与缓存本身所使用的不同的事务管理器。
10.8.5. 与事务管理器集成
虽然这是特定于事务管理器的,但通常需要一个事务管理器对 XAResource
实现的引用,才能在其上调用 XAResource.recover ()
。要获得对 Data Grid XAResource
的引用,可以使用以下 API:
XAResource xar = cache.getAdvancedCache().getXAResource();
常见做法是在与运行事务的不同进程中运行恢复。
10.8.6. 协调
事务管理器将以专有方式通知系统管理员不疑事务。在此阶段,系统管理员知道事务的 XID (字节阵列)。
普通的恢复流程是:
- STEP 1: 系统管理员通过 JMX 连接到数据网格服务器,并列出了重大交易。下图显示了 JConsole 连接到具有重大事务的 Data Grid 节点。
图 10.1. show in-doubt 事务
此时会显示每个 in-doubt 事务的状态(在本示例中" PREPARED ")。status 字段中可能存在多个元素,例如:在某些节点上提交但不是所有节点上的事务时,"PREPARED"和"COMMITTED"。
- STEP 2: 系统管理员视觉地将从事务管理器接收的 XID 映射到 Data Grid 内部 ID,以数字表示。此步骤是必需的,因为 XID (一个字节阵列)无法方便地传递给 JMX 工具(如 JConsole),然后在 Data Grid 的侧重新集合。
- STEP 3 :系统管理员根据内部 ID 强制事务的提交/滚动通过相应的 jmx 操作。以下镜像是通过根据其内部 ID 强制提交事务来获取的。
图 10.2. 强制提交
以上描述的所有 JMX 操作都可以在任何节点上执行,无论事务来自哪里。
10.8.6.1. 根据 XID 强制提交/滚动
也提供基于 XID 的 JMX 操作,以强制进行内部事务的提交/滚动:这些方法接收 XID 阵列,而不是与事务关联的数字(如第 2 步所述)。例如,如果想要为某些不疑事务设置自动完成作业,则这非常有用。这个过程插入事务管理器的恢复中,并可以访问事务管理器的 XID 对象。
10.8.7. 想要了解更多信息?
恢复设计文档 更详细地描述了事务恢复实现内部。