【问题标题】:How can the Three-Phase Commit Protocol (3PC) guarantee atomicity?三阶段提交协议(3PC)如何保证原子性?
【发布时间】:2010-04-30 18:45:29
【问题描述】:

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

这是简化的3PC from the Wikipedia article

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

  1. 两个同类群组参与交易(A 和 B)
  2. 两人各司其职,然后投票支持提交
  3. 协调器现在发送预提交消息...
    • A收到precommit消息,确认,然后长时间离线
    • B 没有收到预提交消息(无论是什么原因),因此仍处于“不确定”状态

结果:

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

你有它:一个队列已提交,另一个已中止。 交易搞砸了。

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

【问题讨论】:

    标签: transactions commit


    【解决方案1】:

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

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

    【讨论】:

    • 好的,这证实了我的论点。我将阅读这些基于仲裁的协议。谢谢
    猜你喜欢
    • 2012-07-01
    • 2014-07-26
    • 2012-06-27
    • 2011-06-06
    • 2014-02-20
    • 1970-01-01
    • 2019-11-03
    • 2012-06-27
    • 2020-11-28
    相关资源
    最近更新 更多