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



考虑这种情况。

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

是否需要手动干预才能解锁锁定的资源?还是参与者轮询协调员以查找交易状态?

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

我可以在这里介绍一些关于Narayana如何工作的细节。XA 恢复策略可能因事务管理器实现而异。

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

Xid由 Narayana 构造(在准备期间传递给资源并保存在资源 txn 日志中,在恢复期间返回到 Narayana),并包含事务管理器 ID (https://wildscribe.github.io/WildFly/11.0.CR1/subsystem/transactions/index.html ->node-identifier)。Narayana 检查Xid是否属于当前 Narayana 实例(节点标识符匹配)。如果是这样,并且 Narayana 事务日志中没有关于Xid的概念,则基于 2PC 假定中止优化 (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),它最终要求资源回滚。这有效地删除了锁。

最新更新