8.8. 事务恢复
恢复是 XA 事务的一个功能,它处理资源的最终性,甚至可能事务管理器失败,并从此类情况下进行相应恢复。
8.8.1. 何时使用恢复
考虑从存储在外部数据库中的帐户传输的分布式事务到数据存储在 Data Grid 中的帐户。调用 TransactionManager.commit ()
时,两个资源都准备成功(1st 阶段)。在提交(2nd)阶段,数据库在从事务管理器接收提交请求前成功应用 whilst Data Grid 的更改。此时,系统处于不一致的状态:从外部数据库中的帐户获取负担,但还没有在 Data Grid 中看到(因为锁定只在两阶段提交协议的第二阶段发布)。恢复会处理这种情况,以确保数据库和数据仓库中的数据都处于一致状态。
8.8.2. 它如何工作
恢复由事务管理器协调。事务管理器与 Data Grid 合作,确定需要人工干预的事务列表,并告知系统管理员(通过电子邮件、日志警报等)。这个过程特定于事务管理器,但通常需要在事务管理器上进行一些配置。
了解 in-doubt transaction ids,系统管理员现在可以连接到 Data Grid 集群,并重播事务的提交或强制回滚。Data Grid 提供了 JMX 工具 - 这在 交易恢复和协调 部分中进行了广泛说明。
8.8.3. 配置恢复
在 Data Grid 中不默认启用恢复。如果禁用,TransactionManager
将无法与 Data Grid 合作来确定 in-doubt 事务。事务配置 部分演示了如何启用它。
注意: restore-cache
属性不是强制的,它为每个缓存进行配置。
要使恢复正常工作,必须将 模式设置为
FULL_XA
,因为需要全用 XA 事务。
8.8.3.1. 启用 JMX 支持
为了可以使用 JMX 管理恢复 JMX 支持,必须明确启用。
8.8.4. 恢复缓存
为了跟踪 in-doubt 事务并能够回复它们,Data Grid 会缓存所有事务状态以供将来使用。此状态仅针对 in-doubt 事务而保留,在提交/注册阶段完成后为成功完成的事务被删除。
这个 in-doubt 事务数据保存在本地缓存中:这允许一个通过缓存加载程序将这个信息转换为磁盘,以防它太大。此缓存可以通过 recovery-cache
配置属性来指定。如果没有指定 Data Grid,则会为您配置本地缓存。
(尽管并不强制)在所有启用了恢复的 Data Grid 缓存间共享相同的恢复缓存。如果默认恢复缓存被覆盖,则指定的恢复缓存必须使用 TransactionManagerLookup 返回与缓存本身使用的不同事务管理器。
8.8.5. 与事务管理器集成
虽然这特定于事务管理器,但通常事务管理器需要引用 XAResource
实现才能在其上调用 XAResource.recover ()
。要获取对 Data Grid XAResource
的引用,可以使用以下 API:
XAResource xar = cache.getAdvancedCache().getXAResource();
常见做法是在与运行事务的不同进程中运行恢复。
8.8.6. 协调
事务管理器以专有的方式告知系统管理员在不做的事务中。在这个阶段,系统管理员知道事务的 XID (字节阵列)。
正常恢复流程是:
- STEP 1: 系统管理员通过 JMX 连接到 Data Grid 服务器,并列出模糊的事务。下图展示了 JConsole 连接到具有模糊事务的 Data Grid 节点。
图 8.1. 显示 in-doubt 事务
此时会显示每个 in-doubt 事务的状态(在本例中为" PREPARED ")。status 字段中可能有多个元素,例如:在特定节点上提交事务但没有在所有节点上提交时,"PREPARED"和"COMMITTED"。
- STEP 2: 系统管理员可视化地将从事务管理器收到的 XID 映射到数据中心内部 ID,以数字表示。此步骤是必需的,因为 XID (字节阵列)无法方便地传递给 JMX 工具(如 JConsole),然后在 Data Grid 端重新编译。
- STEP 3 :系统管理员根据内部 ID 强制通过对应的 jmx 操作强制事务的提交/注册。以下镜像通过强制根据其内部 ID 提交事务来获取。
图 8.2. 强制提交
无论事务的来源是什么,都可以在任何节点上执行上述所有 JMX 操作。
8.8.6.1. 根据 XID 强制提交/注册
用于强制进行事务的提交/回滚的基于 XID 的 JMX 操作也可以可用:这些方法收到描述 XID 而不是与事务关联的数字(如前面在第 2 步所述)。它们很有用,例如,如果一个希望为特定未做的事务设置自动完成作业。这个过程被插入到事务管理器的恢复中,并可访问事务管理器的 XID 对象。