我正在阅读维基百科(http://en.wikipedia.org/wiki/Three-phase_commit_protocol)上的 3 阶段提交协议(protocol),这是我想到的一个场景,其中 3PC 将失败:
假设有两个参与者 A 和 B 以及一个协调者 C:
1)C 向 A 发送了 precommit 消息,在它向 B 发送 precommit 消息之前,A 和 C 同时失败。 2)事务现在重新启动,B 最终中止它,因为没有来自 A 的回复。 3)A 提交事务,因为它已经收到了 precommit 消息。
这不也是3PC应该解决的2PC的原始问题吗? 3PC是如何解决问题的?我错过了什么。谢谢。
最佳答案
更新:
参与者在收到协调者的 doCommit 消息之前是否不提交?
参与者收到 preCommit 消息后,会先等待,如果超时,则继续提交。
如果协调者在发送预提交消息后失败,并且至少有一个参与者具有预提交消息,则系统中的其余部分可以继续并提交,因为他们已经知道系统上的状态。
是的,一旦新的 coordinator 看到他们是已经收到 preCommit 消息的参与者,它就会重新向其他参与者发送 preCommit 消息。
关于distributed-transactions - 三阶段提交协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265565/