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

And*_*Dog 7 transactions commit

我目前正在探索像2PC和3PC这样的原子提交协议的最坏情况,并且我无法找到3PC可以保证原子性的原因.也就是说,它如何保证如果群组A提交,群组B也会提交?

这是维基百科文章中简化的3PC:

英语维基百科上描述的3PC提交协议

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

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

结果:

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

而且你有它:一个队列承诺,另一个队列流产.交易搞砸了.

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

Jer*_*fin 8

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

在Kempster,Stirling和Thannish 的论文中讨论了处理这个问题的各种增强型3PC协议(以及其他地方).