1 2PC

两阶段提交协议为了保证分布在不同节点上的分布式事务的一致性,我们需要引入一个协调者来管理所有的节点,负责各个本地资源的提交和回滚,并确保这些节点正确提交操作结果,若提交失败则放弃事务。

2.1 XA 协议

XA 是一个分布式事务协议,规定了事务管理器和资源管理器接口。因此,XA 协议可以分为两部分,即事务管理器本地资源管理器

  • 事务管理器作为协调者,负责各个本地资源的提交和回滚;
  • 资源管理器就是分布式事务的参与者.其中资源管理通常是 数据库

基于 XA 协议的二阶段提交方法中,二阶段提交协议(The two-phase commit protocol,2PC),用于保证分布式系统中事务提交时的数据一致性,是 XA 在全局事务中用于协调多个资源的机制。

2.2 二阶段提交

分为投票提交两个阶段。

投票为第一阶段:

  • 1 协调者(Coordinator,即事务管理器)会向事务的参与者(Cohort,即本地资源管理器)发起执行操作的 CanCommit 请求,并等待参与者的响应.
  • 2 参与者接收到请求后,会执行请求中的事务操作,记录日志信息(包含事务执行前的镜像),同时锁定当前记录。参与者执行成功,则向协调者发送“Yes”消息,表示同意操作;若不成功,则发送“No”消息,表示终止操作。
  • 3 当所有的参与者都返回了操作结果(Yes 或 No 消息)后,系统进入了提交阶段。

提为第二阶段

协调者会根据所有参与者返回的信息向参与者发送 DoCommit 或 DoAbort 指令

  • 若协调者收到的都是“Yes”消息,则向参与者发送“DoCommit”消息,参与者会完成剩余的操作并释放资源,然后向协调者返回“HaveCommitted”消息;
  • 如果协调者收到的消息中包含“No”消息,则向所有参与者发送“DoAbort”消息,此时发送“Yes”的参与者则会根据之前执行操作时的回滚日志对操作进行回滚,然后所有参与者会向协调者发送“HaveCommitted”消息;
  • 协调者接收到“HaveCommitted”消息,就意味着整个事务结束了。

2.3 2PC问题

同步阻塞问题:二阶段提交算法在执行过程中,所有参与节点都是事务阻塞型的。也就是说,当本地资源管理器占有临界资源时,其他资源管理器如果要访问同一临界资源,会处于阻塞状态。

协调者单点故障导致参与者长期阻塞问题:基于 XA 的二阶段提交算法类似于集中式算法,一旦事务管理器发生故障,整个系统都处于停滞状态。尤其是在提交阶段,一旦事务管理器发生故障,资源管理器会由于等待管理器的消息,而一直锁定事务资源,导致整个系统被阻塞。

数据不一致问题:在提交阶段,当协调者向参与者发送 DoCommit 请求之后,如果发生了局部网络异常,或者在发送提交请求的过程中协调者发生了故障,就会导致只有一部分参与者接收到了提交请求并执行提交操作,但其他未接到提交请求的那部分参与者则无法执行事务提交。于是整个分布式系统便出现了数据不一致的问题。

二阶段无法解决的问题:协调者再发出DoCommit 消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

3 3PC

三阶段提交协议(Three-phase commit protocol,3PC),是对二阶段提交(2PC)的改进。为了解决两阶段提交的同步阻塞和数据不一致问题,三阶段提交引入了超时机制准备阶段

超时机制

同时在协调者和参与者中引入超时机制。如果协调者或参与者在规定的时间内没有接收到来自其他节点的响应,就会根据当前的状态选择提交或者终止整个事务。

准备阶段

在第一阶段和第二阶段中间引入了一个准备阶段,也就是在提交阶段之前,加入了一个预提交阶段。在预提交阶段排除一些不一致的情况,保证在最后提交之前各参与节点的状态是一致的。

3.1 三阶段提交

CanCommit 阶段

协调者向参与者发送请求操作(CanCommit 请求),询问参与者是否可以执行事务提交操作,然后等待参与者的响应;参与者收到 CanCommit 请求之后,回复 Yes,表示可以顺利执行事务;否则回复 No。(我个人理解类似做TCC中Try操作

PreCommit 阶段

协调者根据参与者的回复情况,来决定是否可以进行 PreCommit 操作 或 中断事务。

如果所有参与者回复的都是“Yes”,那么协调者就会执行事务的预执行:

  • 发送预提交请求。协调者向参与者发送 PreCommit 请求,进入预提交阶段。
  • 事务预提交。参与者接收到 PreCommit 请求后执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,同时锁定当前记录。
  • 响应反馈。如果参与者成功执行了事务操作,则返回 ACK 响应,同时开始等待最终指令

如果任何一个参与者向协调者发送了“No”消息,或者等待超时之后,协调者都没有收到参与者的响应,就执行中断事务的操作:

  • 发送中断请求。协调者向所有参与者发送“Abort”消息。
  • 中断事务。参与者收到“Abort”消息之后,或超时后仍未收到协调者的消息,执行事务的中断操作。

DoCommit 阶段

协调者根据参与者的回复情况,来决定是否可以进行 DoCommit 操作 或 中断事务。

如果所有参与者回复的都是“Yes”,那么协调者就会执行事务的提交:

  • 发送提交请求。协调者接收到所有参与者发送的 Ack 响应,从预提交状态进入到提交状态,并向所有参与者发送 DoCommit 消息。
  • 事务提交。参与者接收到 DoCommit 消息之后,正式提交事务。完成事务提交之后,释放所有锁住的资源。
  • 响应反馈。参与者提交完事务之后,向协调者发送 Ack 响应。
  • 完成事务。协调者接收到所有参与者的 Ack 响应之后,完成事务。

如果任何一个参与者向协调者发送了“No”消息,或者协调者等待超时之后,协调者都没有收到参与者的响应,就执行中断事务的操作:

  • 发送中断请求。协调者向所有参与者发送 Abort 请求。
  • 事务回滚。参与者接收到 Abort 消息之后,利用其在 PreCommit 阶段记录的 Undo 信息执行事务的回滚操作,并释放所有锁住的资源。
  • 反馈结果。参与者完成事务回滚之后,向协调者发送 Ack 消息。
  • 中断事务。协调者接收到参与者反馈的 Ack 消息之后,执行事务的中断,并结束事务。

当参与者PreCommit 阶段向协调者发送 Ack 消息后,如果长时间没有得到协调者的响应,在默认情况下,参与者会自动将超时的事务进行提交,不会像两阶段提交那样被阻塞住

3.2 如何解决协调者单点故障导致参与者长期阻塞

由于存在超时机制,即使协调者发生故障,参与者无法及时收到来自协调者的信息之后,他会默认执行commit。避免参与者长期阻塞。

3.3 同步阻塞问题

3PC会在2阶段到3阶段间阻塞,2PC会在1阶段到2阶段整个事务过程中阻塞,因而总体来说3PC并不能不阻塞,只是最大限度减少了阻塞的时间。同时安装5.2也能够解决协调者单点故障导致参与者长期阻塞的问题

3.4 数据不一致问题

3PC和2PC都无法解决数据一致的问题,不过3PC存在超时会通过超时保证协调者和参与者在提交阶段无法通信过程中最终一致,而不需人工介入。

4 小结

分布式事务理论-二阶段提交(Two-phase Commit)相关推荐

  1. 分布式事务:两阶段提交与三阶段提交

    两阶段提交与三阶段提交 分布式事务 二阶段提交 请求阶段 提交阶段 举例 故障分析 柜员侧出现故障或拒绝Proposal 第一阶段经理侧出现故障 第二阶段经理侧出现故障 二阶段提交存在的问题 三阶段提 ...

  2. 分布式理论 二阶段提交 2PC 3PC 端到端一致性 分布式事务

    一.临界知识对我们学习的巨大帮助 临界知识这个概念,是我上个月读<好好学习:个人知识管理精进指南>这本书学到的概念,真的有被启发到,现在觉得它对于我们深刻了解世界有着非常大的作用. 所谓临 ...

  3. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  4. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  5. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究...

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  6. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]...

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  7. 分布式事务 spring 两阶段提交 tcc

    请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...

  8. 正确理解二阶段提交(Two-Phase Commit)

    文章目录 明确问题 草稿方案 原子提交协议希望实现的2个特性 正确的二段提交协议(Two-Phase Commit) 二阶段提交协议如何满足安全性(Safety) 二阶段提交协议如何满足存活性( Li ...

  9. 二阶段提交,三阶段提交,Paxos

    本文转载自:http://blog.csdn.net/u010191243/article/details/52081891 http://blog.chinaunix.net/uid-1672327 ...

最新文章

  1. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)
  2. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...
  3. 【机器学习】K-Means算法的原理流程、代码实现及优缺点
  4. java 空间复杂度_时间复杂度和空间复杂度
  5. 从语义开始 – 概念、意义、实践
  6. UDP聊天小程序+多线程(Python)
  7. android6要多大运存,内存多大手机才能不卡? 现在终于有了答案
  8. asp.net中验证控件的使用方法
  9. android 分享qq微信朋友圈,H5微信JS-SDK实现分享朋友 朋友圈以及QQ自定义分享
  10. DeepFake技术--DeepFakes 概述(一)(二)
  11. 使用Poedit汉化wordpress主题
  12. win10升级补丁_干掉烦人的win10升级助手gwx
  13. 高级OS(十五) - 中断机制以及中断上下部运行和内核代码分析
  14. mysql 表改名_MySQL库改名、表改名
  15. 2014ACM/ICPC亚洲区域赛牡丹江现场赛总结
  16. 设计模式简单RPG游戏设计
  17. 抖音上爆红的美女动态代码图如何实现?
  18. UnauthorizedAccessException:Access to the path “/xx/xx.xx“ is denied
  19. RocketMQ 原理浅析
  20. 基于Ziegler-Nlichols方法的参数整定与PID仿真

热门文章

  1. 10种CSS3实现的Loading效果
  2. 安卓下的免费离线地图导航软件(老虎地图)测试及网盘下载
  3. webbench源码解析
  4. 随笔:写给我深爱的球队
  5. 使用pytz模块进行时区转换及时间计算
  6. 阿里云服务器上安装java配置jdk
  7. 2017年第八届蓝桥杯C/C++ A组国赛 —— 第三题:表达式计算
  8. 第六章 定积分的应用 —— 第一节 定积分的元素法
  9. SVN基本的理解和使用
  10. 【STM32】随机数发生器相关函数和类型