在本参与者cancommit返回yes,其他参与者有返回失败的情况下,本参与者没有收到协调者的预提交指令,是会提交事务还是回滚事务呢?

来源:5-3 二阶段提交的缺陷与三阶段提交的改善与不足

是个么有感情的杀手

2023-04-03

图片描述!](http://img.mukewang.com/szimg/642af32109df986e14300803.jpg)图片描述这两页ppt超时的情况应该是一样的。
但是在第一张ppt中,视频中说参与者2会超时提交。参与者1中断事务,参与者2超时不是也会中断事务吗?所以也就没有一致性的问题了。
第二张ppt中,视频中说参与者b会中断事务。
这两张ppt的说法产生了冲突,帮忙看看吗?

写回答

1回答

大能老师

2023-04-10

我们看第一张图,这里主要表达的场景是在特殊的场景下,会出现不一致的情况:

在完成征集投票之后,协调者发出了「终止事务」的命令,

对于参与者1,它正常收到了该命令,所以参与者1要执行rollback

对于参与者2,它没有正常收到该命令,但由于有超时机制,所以参与者2会按征集投票阶段反馈的结果去执行。也就是说,如果参与者2在征集投票阶段反馈的是「yes」,那么这时它会commit,也就出现了不一致的结果;反之,如果参与者2在征集投票阶段反馈的是「no」,那么这时它也会rollback,刚好两者一致。

所以,从上面的分析我们可以看到,对于参与者2来说,当出现接收指令超时的时候,它该commit还是rollback,并不是固定的,而是取决于它第一步反馈的是什么。


0
1
是个么有感情的杀手
在第二张ppt中,参与者B在征集投票阶段反馈的是[yes],按照以上的说法,参与者B应该是commit而不是中断,这里和视频中的表述有点冲突。还是我哪里理解有误。
2023-04-10
共1条回复

Java分布式架构设计与开发实战

项目贯穿式讲解,真正将理论与实战相结合

325 学习 · 74 问题

查看课程