3.分布式事务-二阶段提交
来源:互联网 发布:我想学软件开发 编辑:程序博客网 时间:2024/06/04 18:58
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
分布式事务,常见的两个处理办法就是两段式提交和补偿。
二阶段提交(英语:Two-phase Commit)是指,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。
需要注意的是,二阶段提交(英文缩写:2PC)不应该与并发控制中的二阶段锁(英文缩写:2PL)进行混淆。
前提
二阶段提交算法的成立基于以下假设:
- 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts)。且节点之间可以进行网络通信。
- 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
- 所有节点不会永久性损坏,即使损坏后仍然可以恢复。
基本算法
以下对二阶段提交算法分阶段进行说明。
第一阶段(提交请求阶段)
- 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
- 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
- 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。
有时候,第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作。
第二阶段(提交执行阶段)
成功
当协调者节点从所有参与者节点获得的相应消息都为"同意"时:
- 协调者节点向所有参与者节点发出"正式提交"的请求。
- 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送"完成"消息。
- 协调者节点收到所有参与者节点反馈的"完成"消息后,完成事务。
失败
如果任一参与者节点在第一阶段返回的响应消息为"终止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
- 协调者节点向所有参与者节点发出"回滚操作"的请求。
- 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送"回滚完成"消息。
- 协调者节点收到所有参与者节点反馈的"回滚完成"消息后,取消事务。
有时候,第二阶段也被称作完成阶段,因为无论结果怎样,协调者都必须在此阶段结束当前事务。
算法示意
下述流程图简单示意了二阶段提交算法中协调者和参与者之间的通信流程
协调者 参与者 QUERY TO COMMIT --------------------------------> VOTE YES/NO prepare*/abort* <-------------------------------commit*/abort* COMMIT/ROLLBACK --------------------------------> ACKNOWLEDGMENT commit*/abort* <-------------------------------- end
"*" 所标记的操作意味着此类操作必须记录在稳固存储上.[1]
缺点
二阶段提交算法的最大缺点就在于 它的执行过程中间,节点都处于阻塞状态。即节点之间在等待对方的相应消息时,它将什么也做不了。特别是,当一个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占有的资源时,这个节点也将连带陷入阻塞状态。
另外,协调者节点指示参与者节点进行提交等操作时,如有参与者节点出现了崩溃等情况而导致协调者始终无法获取所有参与者的响应信息,这时协调者将只能依赖协调者自身的超时机制来生效。但往往超时机制生效时,协调者都会指示参与者进行回滚操作。这样的策略显得比较保守。
- 3.分布式事务-二阶段提交
- 分布式事务二阶段提交
- 分布式事务-二阶段提交与三阶段提交
- 分布式事务:二阶段提交与三阶段提交
- 分布式事务-二阶段提交
- 分布式事务之二阶段提交
- 分布式事务---两阶段提交
- 两阶段提交-分布式事务
- 分布式事务-两阶段提交
- 分布式事务、XA事务、两阶段提交
- 分布式事务、XA事务、两阶段提交
- 分布式事务、XA事务、两阶段提交
- 分布式事务 - 两阶段提交与三阶段提交
- 分布式事务 - 两阶段提交与三阶段提交
- 分布式事务-两阶段提交协议
- 分布式事务中的两阶段提交
- 分布式事务两阶段提交详解
- 分布式事务之两阶段提交
- 关于initramfs
- 向页面传值的方式
- 免费数据集下载
- 我眼中的的光明·第六周·自作孽·五
- KMP的朴素算法与改进
- 3.分布式事务-二阶段提交
- Android DataBinding 初探
- 队列实现异步--通过redis
- 为什么要清除浮动
- Angular运行于nw.js时ng-src无法显示的问题解决
- 图解sendRedirect,include,forward的区别
- Matlab中的括号()[]{}
- 面对对象编程总结(一)
- SpringMVC实例之HelloWorld