三阶段提交
三阶段提交
两阶段提交被称为阻塞(blocking)原子提交协议,因为存在
通常,非阻塞原子提交需要一个完美的故障检测器(perfect failure detector
三阶段提交
(Three-phase commit) ,也叫三阶段提交协议(Three-phase commit protocol) ,是二阶段提交(2PC) 的改进版本。
三阶段提交协议,是二阶段提交协议的改进版本,与二阶段提交不同的是,引入超时机制。同时在协调者和参与者中都引入超时机制。
三阶段提交将二阶段的准备阶段拆分为

与两阶段提交不同的是,三阶段提交有两个改动点。
1、引入超时机制。同时在协调者和参与者中都引入超时机制。 2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
也就是说,除了引入超时机制之外,CanCommit
、PreCommit
、DoCommit
三个阶段。
CanCommit 阶段
1. 事务询问 协调者向参与者发送CanCommit 请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
2. 响应反馈 参与者接到CanCommit 请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes 响应,并进入预备状态。否则反馈No
PreCommit 阶段
协调者根据参与者的反应情况来决定是否可以记性事务的
假如协调者从所有的参与者获得的反馈都是
1. 发送预提交请求 协调者向参与者发送PreCommit 请求,并进入Prepared 阶段。
2. 事务预提交 参与者接收到PreCommit 请求后,会执行事务操作,并将undo 和redo 信息记录到事务日志中。
3. 响应反馈 如果参与者成功的执行了事务操作,则返回ACK 响应,同时开始等待最终指令。
假如有任何一个参与者向协调者发送了
1. 发送中断请求 协调者向所有参与者发送abort 请求。
2. 中断事务 参与者收到来自协调者的abort 请求之后( 或超时之后,仍未收到协调者的请求) ,执行事务的中断。
doCommit 阶段
该阶段进行真正的事务提交,也可以分为以下两种情况。
执行提交
1. 发送提交请求 协调接收到参与者发送的ACK 响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit 请求。
2. 事务提交 参与者接收到doCommit 请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
3. 响应反馈 事务提交完之后,向协调者发送Ack 响应。
4. 完成事务 协调者接收到所有参与者的ack 响应之后,完成事务。
中断事务 协调者没有接收到参与者发送的
1. 发送中断请求 协调者向所有参与者发送abort 请求
2. 事务回滚 参与者接收到abort 请求之后,利用其在阶段二记录的undo 信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
3. 反馈结果 参与者完成事务回滚之后,向协调者发送ACK 消息
4. 中断事务 协调者接收到参与者反馈的ACK 消息之后,执行事务的中断。
在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时之后,会继续进行事务的提交。(其实这个应该是基于概率来决定的,当进入第三阶段时,说明参与者在第二阶段已经收到了PreCommit请求,那么协调者产生PreCommit请求的前提条件是他在第二阶段开始之前,收到所有参与者的CanCommit响应都是Yes。(一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了)所以,一句话概括就是,当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。)
2PC 与3PC 的区别
优点:相比二阶段提交,三阶段提交降低了阻塞范围,在等待超时后协调者或参与者会中断事务。避免了协调者单点问题,阶段
缺点:数据不一致问题依然存在,当在参与者收到
相对于
了解了there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos.
意即世上只有一种一致性算法,那就是