原文作者:程序员小灰

原文地址:漫画:什么是分布式事务?

有趣有内涵的文章第一时间送达!

—————  第二天  —————

假如没有分布式事务,在一系列微服务系统当中,假如不存在分布式事务,会发生什么呢?让我们以互联网中常用的交易业务为例子:

上图中包含了库存和订单两个独立的微服务,每个微服务维护了自己的数据库。在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。正常情况下,两个数据库各自更新成功,两边数据维持着一致性。

但是,在非正常情况下,有可能库存的扣减完成了,随后的订单记录却因为某些原因插入失败。这个时候,两边数据就失去了应有的一致性。

什么是分布式事务?

分布式事务用于在分布式系统中保证不同节点之间的数据一致性。分布式事务的实现有很多种,最具有代表性的是由Oracle Tuxedo系统提出的XA分布式事务协议。XA协议包含两阶段提交(2PC)三阶段提交(3PC)两种实现,这里我们重点介绍两阶段提交的具体过程。

在魔兽世界这款游戏中,副本组团打BOSS的时候,为了更方便队长与队员们之间的协作,队长可以发起一个“就位确认”的操作:

当队员收到就位确认提示后,如果已经就位,就选择“是”,如果还没就位,就选择“否”。

当队长收到了所有人的就位确认,就会向所有队员们发布消息,告诉他们开始打BOSS。

相应的,在队长发起就位确认的时候,有可能某些队员还并没有就位:

以上就是魔兽世界当中组团打BOSS的确认流程。这个流程和XA分布式事务协议的两阶段提交非常相似。那么XA协议究竟是什么样子呢?在XA协议中包含着两个角色:事务协调者事务参与者。让我们来看一看他们之间的交互流程:

第一阶段:

在XA分布式事务的第一阶段,作为事务协调者的节点会首先向所有的参与者节点发送Prepare请求。在接到Prepare请求之后,每一个参与者节点会各自执行与事务有关的数据更新,写入Undo Log和Redo Log。如果参与者执行成功,暂时不提交事务,而是向事务协调节点返回“完成”消息。当事务协调者接到了所有参与者的返回消息,整个分布式事务将会进入第二阶段。

第二阶段:

在XA分布式事务的第二阶段,如果事务协调节点在之前所收到都是正向返回,那么它将会向所有事务参与者发出Commit请求。接到Commit请求之后,事务参与者节点会各自进行本地的事务提交,并释放锁资源。当本地事务完成提交后,将会向事务协调者返回“完成”消息。当事务协调者接收到所有事务参与者的“完成”反馈,整个分布式事务完成。以上所描述的是XA两阶段提交的正向流程,接下来我们看一看失败情况的处理流程:

第一阶段:

第二阶段:

在XA的第一阶段,如果某个事务参与者反馈失败消息,说明该节点的本地事务执行不成功,必须回滚。于是在第二阶段,事务协调节点向所有的事务参与者发送Abort请求。接收到Abort请求之后,各个事务参与者节点需要在本地进行事务的回滚操作,回滚操作依照Undo Log来进行。以上就是XA两阶段提交协议的详细过程。

XA两阶段提交的不足

1.性能问题

XA协议遵循强一致性。在事务执行过程中,各个节点占用着数据库资源,只有当所有节点准备完毕,事务协调者才会通知提交,参与者提交后释放资源。这样的过程有着非常明显的性能问题。

2.协调者单点故障问题

事务协调者是整个XA模型的核心,一旦事务协调者节点挂掉,参与者收不到提交或是回滚通知,参与者会一直处于中间状态无法完成事务。

3.丢失消息导致的不一致问题。

在XA协议的第二个阶段,如果发生局部网络问题,一部分事务参与者收到了提交消息,另一部分事务参与者没收到提交消息,那么就导致了节点之间数据的不一致。

如果避免XA两阶段提交的种种问题呢?

有许多其他的分布式事务方案可供选择:

1.XA三阶段提交

XA三阶段提交在两阶段提交的基础上增加了CanCommit阶段,并且引入了超时机制。一旦事物参与者迟迟没有接到协调者的commit请求,会自动进行本地commit。这样有效解决了协调者单点故障的问题。但是性能问题和不一致的问题仍然没有根本解决。

2.MQ事务

利用消息中间件来异步完成事务的后一半更新,实现系统的最终一致性。这个方式避免了像XA协议那样的性能问题。

3.TCC事务

TCC事务是Try、Commit、Cancel三种指令的缩写,其逻辑模式类似于XA两阶段提交,但是实现方式是在代码层面来人为实现。

分布式服务常见问题—分布式事务相关推荐

  1. 分布式服务常见问题—访问量统计如何做?

    原文作者:逖靖寒的世界 原文地址:分布式实时统计系统--RAINBIRD 最近Twitter开发了一款分布式实时统计系统Rainbird.Rainbird可以用于实时数据的统计: 统计网站中每一个页面 ...

  2. SpringCloudAlibaba 微服务整合分布式事务Seata

    基于AT模式 创建undo_log(回滚日志表)表, 每个数据库需要创建 注意:UNDO_LOG Table:不同数据库在类型上会略有差别.详见官网 -- 注意此处0.7.0+ 增加字段 contex ...

  3. 微服务下分布式事务模式的详细对比

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 作为 Red H ...

  4. 微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.2 实现XA 模式

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 分布式事务 文章目录 微服务 ...

  5. redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)

    1. 数据类型 五大基本类型 String hash -> 类似map list set -> zset -> 基于set的有序集合 新增 bitmaps:其实就是string,主要 ...

  6. 微服务和分布式的区别什么?有什么特点?

    微服务是什么? 微服务架构是团队面对互联网产品爆发式增长的最优选择,要解决的是快速迭代.高可靠和高可用等问题,把复杂度很高的产品拆分成一些较小的模块,并遵循康威定律,每一个模块用5-9个小团队来维护, ...

  7. 微服务和分布式的区别

    分布式架构是分布式计算技术的应用和工具,目前成熟的技术包括J2EE, CORBA和.NET(DCOM),这些技术牵扯的内容非常广,相关的书籍也非常多,也没有涉及这些技术的细节,只是从各种分布式系统平台 ...

  8. 一、【SpringCloud】微服务与分布式架构

    狂神-SpringCloud笔记目录 文章目录 一.微服务与分布式架构 1.1分布式架构 1.2微服务架构 1.3分布式架构的四个核心问题 与解决方案 1.4 Spring Cloud 五大组件 1. ...

  9. 01 手把手带你构建大规模分布式服务--高并发、高可用架构系列,高质量原创好文!...

    作者:丁浪,目前在创业公司担任高级技术架构师.曾就职于阿里巴巴大文娱和蚂蚁金服.具有丰富的稳定性保障,全链路性能优化的经验.架构师社区特邀嘉宾! 阅读本(系列)文章,你将会收获: 全面.体系化的了解大 ...

最新文章

  1. 也许这样理解JavaScript连续赋值更加简单明了一些
  2. reshape2 数据操作 数据融合( cast)
  3. OSPF DR选举的先后
  4. 关于Java类加载双亲委派机制的思考(附面试题)
  5. python压缩算法_用python实现LZ78压缩算法
  6. Android字数限制的EditText实现方案研究
  7. c语言 waveout用法,用C语言发声
  8. 23 个问题 TCP 疑难杂症全解析
  9. 3. IPSEC-XXX与SSL-XXX的使用场景与在等保中涉及的条款
  10. 计算机应用基础题excel,计算机应用基础EXCEL练习题.doc
  11. 使用微信模板消息时,使发送的文本消息换行展示
  12. win10中谷歌浏览器安装插件的位置
  13. 德勤:制造业企业数字化转型方案(PPT)
  14. java代码家庭系谱图,高中生物--遗传系谱图解题一般步骤
  15. 计算机图形学期末复习知识点总结
  16. 阿里巴巴校招实习生一面记录
  17. 这个是我18年整理的,之前在我的电子笔记,现在感觉还是需要分享写写博客大家互相学习更好
  18. DeepSort论文学习
  19. 洛谷 P1719 最大加权矩形 (前缀和,动态规划)
  20. av_interleaved_write_frame错误 Invalid data found when processing input

热门文章

  1. HID 设备(鼠标) report descriptor解析
  2. jQuery 的原型关系图
  3. python 行列式计算
  4. MySQL Group Replication 介绍
  5. TFBOY 养成记 一些比较好多文章。
  6. IOS 本地推送 IOS10.0以上 static的作用 const的作用
  7. Oracle数据库之事务
  8. android NDK 知识汇总
  9. WCF面向服务应用程序系列之十:绑定-标准绑定(HTTP/TCP)
  10. 太棒了!想学英语的好好留着!