distributed-transactions - 三阶段提交如何避免阻塞?

  显示原文与译文双语对照的内容
0 0

我试着理解三阶段提交避免阻塞

请考虑以下两种失败场景:

场景1: 在阶段2 协调器发送preCommit发往所有组群并得到了一个ack与群组A 除外。 网络问题阻止群组A 接收该协调器preCommit消息。 群组A 超时等待preCommit消息并选择放弃。 则两个协调器和组群A 崩溃。

场景2: 协议达到阶段3 。 协调器将doCommit消息发送到群组A 。 但之前发送多个doCommit消息协调器崩溃。 群组A 提交其事务的一部分然后崩溃。

就我所能告诉其余年龄段有完全相同的状态下的末尾场景1 和场景2 。 所以当恢复中协调器步骤从剩余的组群哪会知道我们是否在场景1 和中止或我们在场景2 和commit,从而避免阻塞?

时间:原作者:5个回答

0 0

三阶段提交是不神奇,只是弹性比两阶段提交。 特别是3PC弹性对单一故障点,但不是所有种类的多个点失败。 问题中的两种情况下假定是两点故障。 换句话说,这个问题的前提是错误的,它问多个3PC比他有多蠢

要进一步阅读,这是一个句子从抽象的纸张在这个议题上,Analysis和Verification Two Phase Commit &三相Commit Protocols,通过Muhammad Atif,为了激发你的兴趣:

我们把我们的方法应用到其“amended” variant,Three Phase Commit Protocol ( 3PC ) 和证明它是错误的同时站点故障

我发现本文提供立足点到文学。 没有少量它在这个问题上,如果要深入研究。

原作者:
0 0

在场景1 :

在恢复期间: 所有年龄段,except A,将处于PRECOMMIT状态。 这决定故障恢复节点,所有年龄段当初把票投给了commit和向前移动。 所以A 和Coordinator应为PRECOMMIT状态。 因为这是一个非最终状态事务被中止。

在场景2 :

在恢复期间: 所有年龄段,except A,将处于PRECOMMIT状态。 这决定故障恢复节点到前面所有年龄段当初把票投给了commit和.But A 以来没有收到doCommit邮件它处于COMMITTED状态.Had故障没有发生故障恢复所有组群想多提交,因为至少有一个群组已提交。 因为发生故障( A 崩溃) 恢复节点看到没有实时的提交状态,因此它推导出的组群没有组群拿到doCommit消息。 这样,事务会被中止和所有年龄段ᱻ释放资源。

当A 效益的故障并开始恢复它发现的所有其他年龄段中止事务,而且它也将中止事务。

state chart

原作者:
0 0

在两阶段提交协调器发送一条prepare消息到所有参与者( 节点) 并等待他们的答案 协调器随后将其答案所有其他站点。 每个参与者等待这些答案从协调器之后再提交或中止事务。

两阶段提交协议也有局限性在于,它是 blocking protocol. 例如,可由向将阻止进程在等待* * * * * 协调器。 如果因为某些原因连接失败,参与者将继续等待,可能永远也不会解析其事务。 因此资源可以无限期阻止。 另一方面,协调员也将阻止资源等待回复时参与者。 在这种情况下,协调员也可以阻止在肯定如果没有确认收到从参加者。

但是,三相协议引入了第三个阶段调用 pre-commit. 这是为了的目标'去除不确定时期参与者已提交,正在等待全局中止或提交信息从协调器。

When receiving a pre-commit message, participants know that all others have voted to commit. 
If a pre-commit message has not been received the participant will abort and release any blocked resources. 
原作者:
...