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

时间:2017-09-15 19:42:29

标签: distributed-transactions xa 2phase-commit

考虑这种情况。

  1. 协调员向2名参与者发送准备消息,然后崩溃
  2. 参与者成功锁定资源,然后等待协调员恢复
  3. 协调员恢复,但没有收到参与者关于prepare_success消息的消息
  4. 解锁锁定资源需要手动干预吗?或者参与者是否轮询协调员以查找交易状态?

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

1 个答案:

答案 0 :(得分:1)

我可以在这里详细介绍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))询问所有可用资源。资源返回它所知道的所有不确定事务的Xid

Xid由Narayana构建(在准备期间传递给资源并保存在资源txn日志中,在恢复期间返回Narayana)并包含事务管理器标识(https://wildscribe.github.io/WildFly/11.0.CR1/subsystem/transactions/index.html - > {{1 }})。 Narayana检查node-identifier是否属于当前的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),它最终要求资源回滚。这有效地删除了锁。