【发布时间】:2014-02-20 21:28:34
【问题描述】:
我想了解three-phase commit 如何避免阻塞
考虑以下两种失败场景:
场景 1:在第 2 阶段,协调器向所有群组发送 preCommit 消息,并且已从群组 A 之外的所有群组获得确认。网络问题阻止群组 A 接收协调器的 preCommit 消息。队列 A 等待 preCommit 消息超时并选择中止。然后协调者和队列 A 都崩溃了。
场景 2:协议到达阶段 3。协调器向群组 A 发送一个 doCommit 消息。但在它可以发送更多 doCommit 消息之前,协调器崩溃了。群组 A 提交其事务部分然后崩溃。
据我所知,其余群组在情景 1 和情景 2 结束时具有完全相同的状态。因此,当恢复协调员介入时,它如何从剩余群组中找出我们是否处于情景 1 和中止,或者我们处于场景 2 并提交,从而避免阻塞?
【问题讨论】:
-
这个问题似乎离题了,因为它在程序员的堆栈交换上可能更好。
-
@Abizern 这个问题是一个实用的、可回答的问题,对于软件开发来说是独一无二的。
标签: distributed-transactions 2phase-commit