5

我正在阅读维基百科(http://en.wikipedia.org/wiki/Three-phase_commit_protocol)上的 3 阶段提交协议,这是我想到的 3PC 将失败的场景:

假设有两个参与者 A 和 B 以及一个协调者 C:

1)C 向 A 发送了 precommit 消息,在它向 B 发送 precommit 消息之前,A 和 C 同时失败。2)事务现在重新启动,B 最终中止它,因为没有来自 A 的回复。 3)A 提交事务,因为它已经收到了 precommit 消息。

这不也是3PC应该解决的2PC的原始问题吗?3PC是如何解决问题的?我错过了什么。谢谢。

4

3 回答 3

3

更新:

参与者在收到协调者的 doCommit 消息之前是否不提交?

参与者收到 preCommit 消息后,会先等待,如果超时,则继续提交。

如果协调器在发送预提交消息后失败并且至少有一个参与者具有预提交消息,则系统中的其余部分可以继续并提交,因为他们已经知道系统上的状态。

是的,一旦新的 coordinator 看到他们是已经收到 preCommit 消息的参与者,它会重新向其他参与者发送 preCommit 消息。

于 2012-06-29T16:42:34.923 回答
0
于 2013-03-17T04:01:47.063 回答
0

3PC只容忍单点故障,不能容忍多点故障。实际上,要确保 3PC 正常工作,必须满足以下三个条件:

  1. 没有网络故障(即没有网络分区,如果目标机器正在工作(没有崩溃),每条消息都会在超时之前到达目标)

  2. 最多一名参与者可能会失败(崩溃)。准确地说,如果协调器失败(崩溃),所有队列都不能失败

  3. 参与者机器可以区分超时和失败(这不是微不足道的,考虑一下它什么时候在超时后崩溃(即断电),它无法向持久存储写入任何内容以提醒自己这是超时而不是崩溃恢复时)

这些条件都不实用。所以我不认为3PC可以在现实世界中实现。

于 2015-07-12T04:21:25.727 回答