小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
三阶段提交协议
三阶段提交协议
三阶段提交协议是两阶段提交协议的改进版本,它利用超时机制解决了同步阻塞问题
三阶段提交协议具体描述如下:
- CanCommit(询问阶段):事务协调者想参与者发送事务执行请求,询问是否可以完成指令,参与者只需要回答是或者不是即可,不需要做真正的事务操作,这个阶段有超时中止机制。
- PreCommit(准备阶段):事务协调者会根据参与者的反馈结果决定是否继续执行,如果在询问阶段所有参与者都返回可执行操作,则事务协调者会向所有参与者发送PreCommit请求,参与者收到请求后写redo和undo日志,执行事务操作但是不提交事务,然后返回ACK响应等待事务协调者下一步通知,如果在询问阶段任意参与者返回不能执行操作的结果,那事务协调者会向所有参与者发送事务中断请求。
- DoCommit(提交或回滚阶段):这个阶段也会存在两种结果,根据上一步的执行结果来决定DoCommit的执行方式,如果每个参与者在PreCommit阶段都返回成功,那事务协调者会向所有参与者发起事务提交指令,反之,如果参与者中的任一参与者返回失败,那事务协调者柳会发起中止指令来回滚事务。
注意点: 不管是两阶段提交协议还是三阶段提交协议,都是数据一致性解决方案的实现,在实际应用中需要灵活调整,比如Zookeeper集群中的数据一致性,就用到了优化版的两阶段提交协议,优化的地方是它不需要所有参与者在第一阶段返回成功才能提交事务,而是利用少数服从多数的投票机制来完成数据的提交或者回滚操作。