Narayana/2PC/XA - 准备消息传播失败后解锁资源

Narayana/2PC/XA - Unlock resources after prepare message propagation failure

考虑这种情况。

  1. 协调器向 2 个参与者发送准备消息,然后崩溃
  2. 参与者锁定资源成功,然后等待协调器恢复
  3. 协调器恢复,但未收到来自参与者的关于 prepare_success 条消息的消息

解锁锁定的资源需要人工干预吗?还是参与者轮询协调器来查找事务的状态?

一开始,这听起来类似于参与者没有收到提交消息的情况,但主要区别在于协调器在该场景中重新驱动消息。在上面列出的场景中,协调器甚至不知道它必须重新驱动全局事务,因为它的日志中没有记录。

我可以在这里详细说明 Narayana 的工作原理。 XA 恢复策略可能因事务管理器实现而异。

您所说的场景在 Narayana 中由名为 orphan detection 的程序管理。 正如您指出的那样,Narayana 事务管理器在准备阶段结束之前崩溃,因此 Narayana 日志中没有关于事务存在的信息。这里的要求是 Narayana 配置必须知道所有可能的参与者。在 WildFly 的情况下,它由 standalone.xml 中数据源或资源管理器的定义来确保。恢复过程使用 XAResource.recover 调用 (https://docs.oracle.com/javase/7/docs/api/javax/transaction/xa/XAResource.html#recover(int)) 询问所有可用资源。资源 returns Xid 它知道的所有可疑事务。

Xid 由 Narayana 构造(在准备期间传递给资源并保存在资源 txn 日志中,在恢复期间返回给 Narayana)并包含事务管理器 ID(https://wildscribe.github.io/WildFly/11.0.CR1/subsystem/transactions/index.html -> node-identifier). Narayana checks if the Xid belongs to the current Narayana instance (node identifiers matches). If so and there is no notion about the Xid in the Narayana transaction log, based on 2PC presumed abort optimization (https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/development_guide/java_transaction_api_jta#about_the_presumed_abort_optimization),它最终要求资源回滚。这有效地删除了锁。