三阶段提交协议(3PC)如何保证原子性?

时间:2010-04-30 18:45:30

标签: transactions commit

我目前正在探索原子提交协议(如2PC和3PC)的最坏情况,并且我无法找到为什么3PC可以保证原子性。也就是说,它如何保证如果群组A提交,群组B也提交?

以下是简化的3PC from the Wikipedia article

3PC commit protocol as depicted on English Wikipedia

现在让我们假设以下情况:

  1. 两个群组参与交易(A和B)
  2. 两人都做他们的工作,然后投票提交
  3. 协调员现在发送预先提交的消息......
    • A收到预先提交的消息,确认,然后长时间离线
    • B没有收到预先提交的消息(无论原因是什么),因此仍处于“不确定”状态
  4. 结果:

    • 协调员中止交易,因为并非所有预先提交的消息都已成功发送和确认
    • 处于预先提交状态的
    • A 仍处于离线状态,因此超时且提交
    • 在任何情况下,
    • B中止:他要么保持离线状态,要么超时(导致中止),要么上线并从协调员那里接收中止命令

    而且你有它:一个队列犯了,另一个犯了中止。 交易搞砸了。

    那我在这里错过了什么?根据我的理解,如果超时(在预先提交状态下)的自动提交被无限等待协调器命令所取代,那么这种情况应该可以正常工作。

1 个答案:

答案 0 :(得分:8)

您引用的文章似乎非常准确地涵盖了这种可能性:“此算法的主要缺点是,如果网络以任何方式进行分段,它无法恢复。”你注意到的情况,“A”只是离线,转换为“网络已被分割” - 即“A”现在在一个段中,而“B”和“协调员”在另一部分。

Kempster,Stirling和Thannish在paper中讨论了(以及其他地方)用于解决此问题的各种增强型3PC协议。