跳转到内容

三阶段提交

维基百科,自由的百科全书

三阶段提交(英语:Three-phase commit),也叫三阶段提交协议(英语:Three-phase commit protocol),是在电脑网络及数据库的范畴下,令一个分布式系统内的所有节点能够执行事务的提交的一种分布式算法。三阶段提交是为了解决两阶段提交协议的缺点而设计的。

与两阶段提交不同的是,三阶段提交是一种“非阻塞”的协议。三阶段提交在两阶段提交的第一阶段与第二阶段之间插入了一个准备阶段,令原先在两阶段提交中,参与者在投票之后,由于协调者发生崩溃或错误,而导致参与者处于无法知晓是否提交或者中止的“不确定状态”所产生的可能相当长的延时的问题[1]得以解决。

举例来说,假设有一个决策小组由一个主持人负责与多位组员以电话联络方式协调是否通过一个提案,以两阶段提交来说,主持人收到一个提案请求,打电话跟每个组员询问是否通过并统计回复,然后将最后决定打电话通知各组员。要是主持人在跟第一位组员通完电话后失忆,而第一位组员在得知结果并执行后老人痴呆,那么即使重新选出主持人,也没人知道最后的提案决定是什么,也许是通过,也许是驳回,不管大家选择哪一种决定,都有可能与第一位组员已执行过的真实决定不一致,老板就会认为决策小组沟通有问题而解雇。三阶段提交即是引入了另一个步骤,主持人打电话跟组员通知请准备通过提案,以避免没人知道真实决定而造成决定不一致的失业危机。而三阶段提交为什么能够解决二阶段提交的问题呢?回到刚刚提到的状况,在主持人通知完第一位组员请准备通过后两人意外失忆,即使没人知道全体在第一阶段的决定为何,全体决策组员仍可以重新协调过程或直接否决,不会因出现不一致决定而失业。那么当主持人通知完全体组员请准备通过并得到大家的再次确定后进入第三阶段,当主持人通知第一位组员请通过提案后两人意外失忆,这时候其他组员再重新选出主持人后,仍可以知道目前至少是处于准备通过提案阶段,表示第一阶段大家都已经决定要通过了,此时便可以直接通过。

算法原理

[编辑]

在提交阶段,如果协调器和队列成员都发生故障,两阶段提交协议无法可靠地恢复。如果只有协调器发生故障,而没有队列成员收到提交消息,则可以安全地推断没有发生提交。但是,如果协调器和队列成员都发生故障,则发生故障的队列成员可能是第一个收到通知并实际执行了提交的成员。即使选择了新的协调器,它也无法自信地继续操作,直到收到所有队列成员的同意,因此必须阻塞直到所有队列成员响应。

三阶段提交协议通过引入准备提交状态消除了这个问题。如果协调器在发送预提交消息之前失败,则队列将一致认为操作已中止。在所有队列成员都确认他们准备好提交之前,协调器不会发送提交消息。这消除了任何队列成员在所有队列成员都知道这样做的决定之前实际完成事务的可能性(这种模糊性导致两阶段提交协议中需要无限期阻塞)。

解决方案

[编辑]

上面介绍的预提交阶段可以帮助系统在提交阶段的参与者或协调者和参与者都失败时进行恢复。当恢复协调者在两阶段提交的提交阶段协调者失败后接管时,新的预提交会派上用场:在查询参与者时,如果它了解到某些节点处于提交阶段,则它会假定崩溃前的上一个协调者已做出提交的决定。因此它可以引导协议提交。类似地,如果参与者说它没有收到PrepareToCommit消息,那么新的协调器甚至可以假设前一个协调器在完成PrepareToCommit阶段之前就已经失败了。因此,它可以安全地假设没有参与者提交更改,从而安全地中止事务。

参考资料

[编辑]
  1. ^ Distributed Systems: Concepts and Design, G. Coulouris, J, Dollimore, Tim K., Gordon Blair, Fifth edition, Pearson, 2012