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

Distributed transactions Narayana/2PC/XA-准备消息传播失败后解锁资源,distributed-transactions,xa,2phase-commit,Distributed Transactions,Xa,2phase Commit,考虑一下这个场景 协调员向2名参与者发送准备消息,然后崩溃 参与者成功锁定资源,然后等待协调员恢复 协调器已恢复,但未收到参与者发送的有关准备\u成功消息的消息 解锁锁定的资源是否需要手动干预?或者参与者是否轮询协调员以查找事务的状态 首先,这听起来类似于参与者没有收到提交消息的情况,但主要区别在于协调器在该场景中重新驱动消息。在上面列出的场景中,协调器甚至不知道它必须重新驱动全局事务,因为它的日志中没有记录 我可以在这里详细介绍Narayana的工作原理。根据事务管理器的实现,XA恢复策略可能

考虑一下这个场景

协调员向2名参与者发送准备消息,然后崩溃 参与者成功锁定资源,然后等待协调员恢复 协调器已恢复,但未收到参与者发送的有关准备\u成功消息的消息 解锁锁定的资源是否需要手动干预?或者参与者是否轮询协调员以查找事务的状态


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

我可以在这里详细介绍Narayana的工作原理。根据事务管理器的实现,XA恢复策略可能会有所不同

您所讨论的场景在Narayana中由一个名为孤儿检测的过程进行管理。 正如您所指出的,Narayana事务管理器在准备阶段结束之前崩溃,因此Narayana日志中没有关于事务存在的信息。这里的要求是Narayana配置必须了解所有可能的参与者。对于WildFly,它通过在standalone.xml中定义数据源或资源管理器来确保。恢复过程使用XAResource.recover调用询问所有可用资源。资源返回它知道的所有可疑事务的Xid

Xid由Narayana构造,在准备期间传递给资源,并保存在资源txn日志中,在恢复期间返回给Narayana,并包含事务管理器id->节点标识符。Narayana检查Xid是否属于当前Narayana实例节点标识符匹配。如果是这样,并且Narayana事务日志中没有关于Xid的概念,那么基于2PC假定的中止优化,它最终会请求资源回滚。可以有效地移除锁