本文主要是介绍二段提交协议、三段提交协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、二段提交协议
2pc提交事务阶段------投票阶段
协调者发起事务请求到所有的参与者,参与者接收到事务请求后判断自身情况,如果不能执行事务,则反馈不能提交事务,返回NO,如果可以就执行事务,并将undo和redo信息记录事务日志中,反馈Yes
执行事务阶段
协调者收到所有参与者反馈Yes就发布commit命令,否则如果超时未收到或者收到NO 那么发布回滚命令。
参与者收到commit的请求后正式提交事务操作,提交后释放资源。完成事务后向协调者发送ack消息 协调者收到所有参与者的ack后完成事务。
参与者收到rollback的请求查找undo记录,完成回滚后释放资源。完成事务后向协调者发送ack消息 协调者收到所有参与者的ack后中断事务。
优点:原理简单,实现方便
缺点:同步阻塞,单点问题,脑裂问题,太过保守--超时机制,数据不一致---第二阶段部分事务提交。
2、三阶段提交协议
3pc
第一阶段
cancommit
1、协调者向所有参与者发布包含事务内容的canCommit命令,等待参与者回应。
2、参与者认为自身能执行,则返回yes。否则返回NO
第二阶段
preCommit阶段
1、如果协调者收到的反馈都是yes,那么发出preCommit命令,进入prepared阶段,参与者收到preCommit命令后,执行事务操作。并写入undo和redo信息到事务日志中。然后想协调者反馈ack相应
2、如果协调者收到的返回时NO,那么发布abort命令。各参与者收到abort或者超时,都中断事务。
第三阶段,
docommit阶段
如果协调者收到所有参与者的ack相应,那么会发出doCommit命令,所有参与者收到docommit命令就提交事务,然后释放资源。向协调者发出ack。协调者收到所有参与者的ack详细后完成事务。
如果协调者收到No反馈或者超时响应后,将对所有的参与者发出abort请求。各个参与者收到abort请求后会利用undo信息回滚事务。,然后释放资源,反馈ack。协调者收到所有ack消息后,中断事务。
需要注意的是,在第三阶段如果参与者没有收到docommit命令,那么超时后它会提交事务,毕竟第一阶段所有的参与者都响应了,默认他们都能正常工作。
优缺点:
优点:即第三阶段的超时提交。降低了参与者的阻塞范围,并且能够再出现单点故障后继续达成一致。
缺点:数据可能也会不一致。也存在2pc中的缺点
这篇关于二段提交协议、三段提交协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!