考虑这种情况。
解锁锁定资源需要手动干预吗?或者参与者是否轮询协调员以查找交易状态?
首先,这听起来类似于参与者未收到提交消息的情况,但主要区别在于协调员在该方案中重新传递消息。在上面列出的场景中,协调员甚至不知道它必须重新启动全局事务,因为在它的日志中没有记录它。
答案 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),它最终要求资源回滚。这有效地删除了锁。