考虑这种情况。
- Coordinator 向 2 个参与者发送准备消息,然后崩溃
- 参与者锁定资源成功,然后等待协调者恢复
- Coordinator 恢复,但没有收到参与者关于 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) )询问所有可用资源。Xid
它知道的所有不确定事务的资源返回。
由Xid
Narayana 构建(在准备期间传递给资源并保存在资源 txn 日志中,在恢复期间返回给 Narayana)并包含事务管理器 ID(https://wildscribe.github.io/WildFly/11.0.CR1/subsystem/transactions /index.html -> node-identifier
)。Narayana 检查是否Xid
属于当前 Narayana 实例(节点标识符匹配)。如果是这样,并且Xid
在 Narayana 事务日志中没有关于 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) ,它最终要求资源回滚。这有效地删除了锁。