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

Transactions 三阶段提交协议(3PC)如何保证原子性?,transactions,commit,Transactions,Commit,我目前正在探索原子提交协议(如2PC和3PC)的最坏情况,我无法找到为什么3PC可以保证原子性。也就是说,它如何保证如果队列A提交,队列B也提交 以下是简化的: 现在让我们假设以下情况: 两个队列参与交易(A和B) 两人都做自己的工作,然后投票支持“承诺” 协调器现在发送预提交消息。。。 A接收预提交消息并确认,然后长时间脱机 B没有收到预提交消息(无论原因是什么),因此仍然处于“不确定”状态 结果是: 协调器中止事务,因为并非所有预提交消息都已成功发送和确认 处于预提交状态的仍处于脱机

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

以下是简化的:

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

  • 两个队列参与交易(A和B)
  • 两人都做自己的工作,然后投票支持“承诺”
  • 协调器现在发送预提交消息。。。
    • A接收预提交消息并确认,然后长时间脱机
    • B没有收到预提交消息(无论原因是什么),因此仍然处于“不确定”状态
  • 结果是:

    • 协调器中止事务,因为并非所有预提交消息都已成功发送和确认
    • 处于预提交状态的仍处于脱机状态,因此超时并提交
    • B在任何情况下都会中止:他要么保持脱机状态并超时(导致中止),要么在线并从协调器接收中止命令
    现在你看到了:一组人犯了罪,另一组人流产了交易已完成。


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

    您引用的文章似乎非常准确地介绍了这种情况:“此算法的主要缺点是,如果网络以任何方式分段,它将无法恢复。”您注意到的情况是,“A”只是离线,转换为“网络已分段”——即“A”现在在一个分段中,而“B”和“协调器”在另一个分段中


    Kempster、Stirling和Thannish在一篇文章中讨论了处理此问题的各种增强型3PC协议(以及其他地方)。

    好的,这证实了我的论点。我将阅读这些基于仲裁的协议。谢谢