热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

分布式事务03XA,2PC,3PC等理论知识

XA2PCXA和2PC间的关系XA的事务模型只说明需要做什么事情,但具体怎么实习未说明,相对较需2PC是将XA规范进行落地,可以简单理解为XA是接口,而2PC是XA的具体实现类(不

XA/2PC

XA和2PC间的关系

XA的事务模型只说明需要做什么事情, 但具体怎么实习未说明, 相对较需

2PC是将XA规范进行落地, 可以简单理解为 XA 是接口, 而 2PC 是 XA 的具体实现类(不正确的想法)


XA/2PC的角色

X/Open的组织定义了分布式事务的模型,这里面有几个角色,就是AP(Application,应用程序),TM(Transaction Manager,事务管理器),RM(Resource Manager,资源管理器),CRM(Communication Resource Manager,通信资源管理器)


XA/2PC的流程

AP让TM生成一个全局事务

阶段一prepare

准备阶段: TM向让各个RM开启一个事务, 并执行对应的sql, 但是不commit(等待TM的通知)

阶段二commit

提交阶段: 各个RM都向TM返回一个执行结果



  1. 如果都成功, 那么TM就让RM的事务都提交

  2. 如果有一个失败, 或者有一个迟迟没有响应, TM就让RM回滚各自的本地事务

只有都提交成功了, 分布式事务才叫成功


XA/2PC的问题

同步阻塞

阶段一(prepare)的时候, 数据库的资源会被占用, 直到阶段二完成, 此时有其他应用需要访问资源, 就需要等待

脑裂

如果由于网络问题, 导致后来, 一些库commit了, 另一些库没有收到commit的消息, 数据一致性出现问题

单点故障

TM是单机, 如果TM故障, 整个分布式事务就凉凉, 可能会一直卡住, 无法执行, 或者数据错误



  1. TM宕机, RM正常

    TM宕机, 则无法下达后续指令, 在阶段一的RM会一直阻塞住

  2. TM、RM 都宕机

    就算由主从/热备等机制, 保证TM知道对哪些机子已经发送过哪些指令, 但还是有一种问题无法解决

    TM发送消息, 要所有RM执行阶段二, 假设有 2个RM, RM1接收到Commit指令并执行成功, RM2接到Commit指令但是没执行就宕机了, 虽然可以通过其他通信手段使得最终事务一致, 但是在该通信手段执行期间, AB是不一致的, 整个数据是有问题的

    (其实RM2到底执行了没有是不知道的, 因为宕机了不知道是否执行提交了没)


3PC

三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。


3PC流程

CanCommit 阶段

TM发送消息给各个RM, RM返回一个响应, 说明TM与各个RM之间网络通信正常(感觉有点像http协议)

PreCommit 阶段

像 2PC 的阶段一, 没什么不同的

DoCommit 阶段

像 2PC 的阶段二, 就多一个RM没有无法及时接收到来自TM的doCommit或者abort请求时,会在等待超时之后直接提交事务


3PC相对2PC的变动点

TM的超时响应机制

当TM宕机后, RM在长时间未接收到TM的指令时, 会自动提交本地事务(但还是无法解决事务一致性问题)

将2PC的阶段一拆分为2个阶段(CanCommit、PreCommit)

就是看看会不会有网络问题, 如脑裂之类的问题


优点

降低同步阻塞

事务开启后会先判断基本环境是否畅通, 而不是直接执行事务, 一定程度上避免了某个RM出现问题, 而其他RM已经执行了SQL还需要回滚(对资源的占用)

RM超时会自动提交, 避免RM一直占用资源

一定程度上提高了数据的一致性

可以解决, 当TM宕机, 部分RM提交, 而有的RM为收到 doCommit 命令, 那么这些RM超时会自动提交

可以这么理解, 当在doCommit阶段的时候, 说明canCommit阶段全部通过, 那么事务会很大概率能执行成功(为什么这么乐观?), 所以当canCommit的时候一直没有接到commit或abort指令, 很可能是TM宕机了, 那直接自行commit


缺点

产生新的数据不一致问题

如果TM是要求回滚, RM应该收到abort命令回滚, 然后还没全发完TM就宕机, 那么会导致部分RM回滚, 而超时的RM会自动提交

https://zhuanlan.zhihu.com/p/91263461



推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨架构师在项目中应如何平衡对产品的关注和对团队成员的关注,以实现最佳的开发成果。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 本文探讨了2012年4月期间,淘宝在技术架构上的关键数据和发展历程。涵盖了从早期PHP到Java的转型,以及在分布式计算、存储和网络流量管理方面的创新。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文探讨了大数据生态系统的构建,重点介绍其分布式存储和运算机制,并补充相关技术及应用场景。 ... [详细]
author-avatar
你就是一朵奇葩_518
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有