美文网首页循序渐进学分布式
一致性协议之三阶段提交协议(3PC)

一致性协议之三阶段提交协议(3PC)

作者: 躁动的中年大叔 | 来源:发表于2018-08-05 16:43 被阅读75次

3PC也是一致性协议的一种,在2PC的基础上做了一些改进,于是有了3PC。

3PC是把2PC的阶段二(事务提交)一分为二,形成了由CanCommit、PreCommit、DoCommit三个阶段组成。

3PC协议过程

阶段一: CanCommit

1. 事务问询

协调者向参与者发送CanCommit请求,询问是否可以执行事务提交操作。

2. 事务反馈

各参与者接受到CanCommit请求后,如果认为自身可以成功执行事务,则反馈Yes响应,并进入预备状态;否则反馈No响应

阶段二: PreCommit

协调者根据1.2各参与者的响应情况来决定是否执行PreCommit,即存在2种情况。

1. 执行PreCommit
1.1 发送PreCommit请求

协调者向所有参与者发送PreCommit请求,并进入Prepared阶段。

1.2 执行事务操作

各参与者收到PreCommit请求后会执行事务操作,并记录Undo和Redo信息到事务日志中。

1.3 反馈结果

如果参与者成功执行了事务操作,则反馈Ack响应。同时等待最终的指令:终止or提交。

2. 中断事务

如果在阶段一(事务反馈)中协调者收到了任何一个参与者反馈No响应,或在等待超时之后,协调者就会中断事务。

2.2.1 发送中断请求

协调者向所有参与者发送abort请求。

2.2.2 中断事务

所有收到abort请求或者等待超时的参与者执行中断事务操作。

阶段三:DoCommit

该阶段执行真正的事务提交,会存在以下两种情况:

情况一:执行DoCommit
1.发送提交请求

如果协调者处于正常的工作状态,且收到了所有参与者的Ack响应,那么它将从“预提交”状态转换到“提交状态”,并向所有的参与者发送doCommit请求。

2. 事务提交

参与者接收到doCommit请求后,会正式执行事务提交操作,并在完成之后释放整个事务执行期间占用的资源。

3. 反馈结果

参与者完成事务提交后,向协调者发送Ack响应。

4. 完成事务

协调者接收到所有参与者反馈Ack消息后,完成事务。

情况二:中断事务

在PreCommit阶段有任意一个参与者向协调者返回了No响应,或者等待超时之后,协调者就会中断事务。

1. 发送中断请求

协调者向所有的参与者发送abort请求。

2. 事务回滚

参与者收到abort请求后,利用在PreCommit阶段中记录的Undo信息来执行事务回滚,然后释放事务期间占用的资源。

3. 反馈事务回滚结果

参与者完成事务回滚操作后,向协调者发送Ack响应。

4. 中断事务

协调者收到所有参与者的Ack消息后,中断事务。


需要注意的是,一旦进入到阶段三之后,可能会出现以下两种故障:

  1. 协调者出现问题。
  2. 协调者和参与者之间的网络出现故障。

出现上述情况之后,最终都会导致参与者无法及时接收到来自协调者的doCommit或是abort请求,针对这种情况,参与者在等待超时之后,继续进行事务提交。

相关文章

网友评论

    本文标题:一致性协议之三阶段提交协议(3PC)

    本文链接:https://www.haomeiwen.com/subject/spjamftx.html