【问题标题】:Three phase commit三阶段提交
【发布时间】:2012-06-27 21:39:44
【问题描述】:

我了解三阶段提交是为了解决“两阶段提交”的问题,因为在第二阶段协调者和队列同时失败,无法知道协调者是否已决定提交消息.

显然三阶段提交旨在通过添加一个额外的阶段来解决这个问题。但是,如果协调者和队列失败,您在第三阶段不会面临完全相同的问题吗?

【问题讨论】:

  • 为了后代,这里是维基百科定义 3 阶段提交的方式:en.wikipedia.org/wiki/Three-phase_commit_protocol
  • 这篇文章的要点是:三阶段提交协议通过引入准备提交状态消除了这个问题。如果协调器在发送 preCommit 消息之前失败,则群组将一致同意该操作已中止。在所有群组成员确认他们准备提交之前,协调器不会发送 doCommit 消息。这消除了任何同类群组成员在所有同类群组成员都知道这样做的决定之前实际完成交易的可能性
  • 我只是不明白添加额外的阶段将如何帮助解决问题

标签: distribution distributed distributed-transactions


【解决方案1】:

在 3PC 中,可以通过查询剩余的活动群组来找出失败的协调器决策。如果任何活动群组处于预提交状态 - 这意味着他们所有人都同意提交(否则协调员不会发送预提交)。我们需要提交其余的同类群组,因为失败的群组可能已经提交。

如果没有任何群组处于预提交状态 - 我们可以假设协调员没有向任何群组发送“提交”,因此没有发生副作用并且我们可以中止。

这里有一个很好的解释: http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

【讨论】:

  • "如果任何活动群组处于预提交状态 - 这意味着他们都同意提交(否则协调员不会发送预提交)。我们需要提交其余的同伙,因为失败的人可能已经承诺了。”但是,如果协调者从未收到失败队列的“是”(在协调者发送预提交后,由于延迟)并发送了中止,失败的队列收到该中止,中止事务然后失败?
猜你喜欢
  • 2012-07-01
  • 2014-02-20
  • 2014-07-26
  • 2011-11-15
  • 2011-11-24
  • 2013-05-21
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多