【问题标题】:Narayana/2PC/XA - Unlock resources after prepare message propagation failureNarayana/2PC/XA - 准备消息传播失败后解锁资源
【发布时间】:2018-02-25 01:20:34
【问题描述】:

考虑这种情况。

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

是否需要人工干预才能解锁锁定的资源?或者参与者是否轮询协调器以查找事务的状态?

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

【问题讨论】:

    标签: distributed-transactions xa 2phase-commit


    【解决方案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)并包含事务管理器 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),它最终要求资源回滚。这有效地消除了锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多