两阶段提交协议

Posted 拂晓杂谈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两阶段提交协议相关的知识,希望对你有一定的参考价值。

一、两阶段提交协议

之前的推送中,有说过分布式事务要保证原子性通常要使用两阶段提交协议(2PC),今天就来讲一下。


先来复习一下什么是原子性:就是要么全部成功,要么全部不成功。那么放到分布式上来讲,有时候,一个事务会涉及到多个节点,要么这些节点全部成功,要么这些节点全部不成功。那么如何去知道哪些节点成功?哪些节点不成功呢?两阶段提交协议解决了这个问题。

两阶段提交协议将涉及到某一事务的节点们分成了两类,其中一类叫做协调者(coordinator),协调者一般只有一个,当然有的也会有备用协调者。剩下的节点叫做参与者。

两阶段提交协议的第一阶段称为请求阶段(prepare phase):在请求阶段中,协调者会询问参与者们,你们的事务OK了吗?参与者将自己的情况告诉协调者。

第二阶段称为提交阶段(commit phase):在提交阶段,协调者看一下参与者们返回来的情况,如果有一个不OK,那么这整个事务就失败,参与者通知协调者们事务失败;如果参与者们全部OK,那么这个事务就OK,协调者通知参与者们事务成功。


二、缺点

两阶段提交协议其实是很低效的。原因有:

1)某个参与者可能一直不返回信息,那么协调者由于没法获得所有的参与者的消息,被阻塞在第一阶段。协调者会设置一个超时时间,如果过了超时时间协调者还没收到全部参与者返回的信息,则事务失败。

2)协调者发生了故障。协调者应该将事务相关信息记录到操作日志中,当协调者发生故障时候,备用协调者可以接替他完成后续操作。若是没有备用协调者,则其他参与者会一直等待下去。

以上是关于两阶段提交协议的主要内容,如果未能解决你的问题,请参考以下文章

知识贴:分布式事务的两阶段提交协议(2PC)

两阶段提交协议

分布式事务两阶段提交协议三阶提交协议

两阶段提交协议的异常处理

浅谈mysql的两阶段提交协议

两阶段提交协议的 ACID 是怎样的?