英文名:Two Phase Commit(2PC)
算法目的:实现分布式事物
算法概述:
有两类节点:
-----协调者
-----事务参与者
流程阶段:
-----请求阶段
-----提交阶段
算法成立的前提条件:
1.存在一个协调者,其他节点为参与者,节点间使用网络通信
2.所有节点都采用预写式日志,且日志被写入后放在可靠性高的存储设备上,计时设备损坏,日志不丢失.
3.所有节点不会永久性损坏,即使损坏后仍可以恢复.
注:"预写式日志":预写式日志(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID属性中的两个)的一系列技术。在使用WAL的系统中,所有的修改在提交之前都要先写入log文件中。
log文件中通常包括redo和undo信息。
流程详述:
第一阶段:
成为提交请求阶段,分为以下三步:
1.协调者节点向所有参与者节点询问是否可以执行提交操作,并等待响应.
2.参与者节点执行询问发起为止所有的事物操作,并将undo信息和redo信息写入日志.
3.各参与者节点响应协调者发起的询问,如果参与者节点的事物操作实际执行成功,返回给协调者"同意",如果失败,返回"不同意".
第二阶段:
也成提交执行阶段,分为两种情况:
一.所有参与者回复的都是"我同意".
1.协调者节点向所有参与者节点发出"正式提交"的命令.
2.参与者节点正式完成操作,并释放相关资源.
3.参与者节点返回给协调者"我搞定了".
4.协调者再收到所有"我搞定了"之后,结束事务.
二.有任一参与者返回了"我不同意":
1.协调者节点向所有参与者节点发出"回滚操作"的请求.
2.参与者节点利用之前写的undo信息进行回滚,并释放资源.
3.参与者返回"我回滚完了"给协调者
4.协调者收到所有"我回滚完了"信息之后,事务宣告结束.
缺点:
二阶段提交算法的最大缺点就在于 它的执行过程中间,节点都处于阻塞状态。即节点之间在等待对方的相应消息时,它将什么也做不了。特别是,当一个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占有的资源时,这个节点也将连带陷入阻塞状态。
另外,协调者节点指示参与者节点进行提交等操作时,如有参与者节点出现了崩溃等情况而导致协调者始终无法获取所有参与者的响应信息,这是协调者将只能依赖协调者自身的超时机制来生效。但往往超时机制生效时,协调者都会指示参与者进行回滚操作。这样的策略显得比较保守。