138 分布式事务之两阶段提交

Posted 朋朋书苑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了138 分布式事务之两阶段提交相关的知识,希望对你有一定的参考价值。

Two-phase Commit 二阶段提交

为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。

算法思路:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作

算法前提

二阶段提交算法的成立基于以下假设:

  1. 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Participants)。且节点之间可以进行网络通信。

  2. 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。

  3. 所有节点不会永久性损坏,即使损坏后仍然可以恢复。

第一阶段

提交请求阶段协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。有时候,第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作。

第二阶段

提交执行阶段

成功

当协调者节点从所有参与者节点获得的相应消息都为"同意"时:协调者节点向所有参与者节点发出"正式提交"的请求。参与者节点正式完成操作,并释放在整个事务期间内占用的资源。参与者节点向协调者节点发送"完成"消息。协调者节点收到所有参与者节点反馈的"完成"消息后,完成事务。

失败

如果任一参与者节点在第一阶段返回的响应消息为"终止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:1. 协调者节点向所有参与者节点发出"回滚操作"的请求。2. 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。3. 参与者节点向协调者节点发送"回滚完成"消息。4. 协调者节点收到所有参与者节点反馈的"回滚完成"消息后,取消事务。有时候,第二阶段也被称作完成阶段,因为无论结果怎样,协调者都必须在此阶段结束当前事务。

以上是关于138 分布式事务之两阶段提交的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务之两阶段提交(2PC)

ZooKeeper之两阶段提交

flink exectly-once系列之两阶段提交概述

分布式事务 两阶段提交及JTA

MySQL binlog 组提交与 XA(分布式事务两阶段提交)

精通Java事务编程-可串行化隔离级别之两阶段锁定(2PL,two-phase locking)