漫画:什么是分布式事务?

简介: 什么是分布式事务?分布式事务用于在分布式系统中保证不同节点之间的数据一致性。分布式事务的实现有很多种,最具有代表性的是由Oracle Tuxedo系统提出的XA分布式事务协议。

image.pngimage.png


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

image.pngimage.pngimage.png

image.pngimage.png

image.pngimage.pngimage.pngimage.png

————————————


image.pngimage.pngimage.pngimage.png

假如没有分布式事务


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

image.png


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


正常情况下,两个数据库各自更新成功,两边数据维持着一致性。

image.png



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

image.png

image.pngimage.png


什么是分布式事务?


分布式事务用于在分布式系统中保证不同节点之间的数据一致性。分布式事务的实现有很多种,最具有代表性的是Oracle Tuxedo系统提出的XA分布式事务协议。


XA协议包含两阶段提交(2PC)三阶段提交(3PC)两种实现,这里我们重点介绍两阶段提交的具体过程。

image.pngimage.pngimage.png

image.png


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

image.png


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

image.png


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


image.png


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


image.pngimage.pngimage.png


以上就是魔兽世界当中组团打BOSS的确认流程。这个流程和XA分布式事务协议的两阶段提交非常相似。


那么XA协议究竟是什么样子呢?在XA协议中包含着两个角色:事务协调者事务参与者。让我们来看一看他们之间的交互流程:


第一阶段:


image.png


在XA分布式事务的第一阶段,作为事务协调者的节点会首先向所有的参与者节点发送Prepare请求。


在接到Prepare请求之后,每一个参与者节点会各自执行与事务有关的数据更新,写入Undo Log和Redo Log。如果参与者执行成功,暂时不提交事务,而是向事务协调节点返回“完成”消息。


当事务协调者接到了所有参与者的返回消息,整个分布式事务将会进入第二阶段。


第二阶段:

image.png


在XA分布式事务的第二阶段,如果事务协调节点在之前所收到都是正向返回,那么它将会向所有事务参与者发出Commit请求。


接到Commit请求之后,事务参与者节点会各自进行本地的事务提交,并释放锁资源。当本地事务完成提交后,将会向事务协调者返回“完成”消息。


当事务协调者接收到所有事务参与者的“完成”反馈,整个分布式事务完成。


以上所描述的是XA两阶段提交的正向流程,接下来我们看一看失败情况的处理流程:



第一阶段:

image.png


第二阶段:

image.png


在XA的第一阶段,如果某个事务参与者反馈失败消息,说明该节点的本地事务执行不成功,必须回滚。


于是在第二阶段,事务协调节点向所有的事务参与者发送Abort请求。接收到Abort请求之后,各个事务参与者节点需要在本地进行事务的回滚操作,回滚操作依照Undo Log来进行。


以上就是XA两阶段提交协议的详细过程。


image.pngimage.png


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两阶段提交,但是实现方式是在代码层面来人为实现。


image.png

几点补充:


.本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。


—————END—————

相关文章
|
开发框架 架构师 Java
《深入理解分布式事务:原理与实战》,不可错过的精品!
在分布式应用系统中,特别是在金融相关的场景下,分布式事务是大家都关注的核心技术,同样也是系统的技术难点。本书从数据库和服务的分布式基础开始,由浅入深阐述了分布式事务的原理、解决方案。这种以框架开发者视角分享的分布式事务实现的源码和实践用例,对于应用架构师和开发者都有极大的价值。
4563 1
《深入理解分布式事务:原理与实战》,不可错过的精品!
|
6月前
|
消息中间件 Kafka
温故知新-消息中间件篇
温故知新-消息中间件篇
29 0
|
10月前
|
设计模式 Cloud Native 架构师
分享一份美团T9大牛总结的神仙微服务架构设计模式PDF
微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题。 企业和服务提供商正在寻找更好的方法将应用程序部署在云环境中,微服务被认为是未来的方向。通过将应用和服务分解成更小的、松散耦合的组件,它们可以更加容易升级和扩展,理论上是这样。
|
12月前
|
设计模式 消息中间件 NoSQL
查漏补缺第三期(分布式事务相关)
前言 目前正在出一个查漏补缺专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本专题主要以Java语言为主, 好了, 废话不多说直接开整吧~ Q1 & 分布式事务有了解过吗?你是如何解决的呢? 如果简历中出现过分布式相关项目经验,提到过分布式事务的字眼,并且对方要求面试者有相关开发经验,基本上这个问题是必问的。
|
消息中间件 SQL 存储
对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)
对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)
|
消息中间件 SQL 缓存
分布式事务知多少?
事务(Transaction)指的是一组操作,该操作具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),也就是常说的ACID 原则。原子性(Atomicity):事务只能全部发生或者全部不发生。一致性(Consistency):事务需要得到逻辑上正确的结果,这由...
104 0
分布式事务知多少?
分布式事务,阿里为什么钟爱TCC
分布式事务,阿里为什么钟爱TCC
418 1
分布式事务,阿里为什么钟爱TCC
|
消息中间件 监控 数据库
|
SQL 消息中间件 算法
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(下)
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(下)
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(下)
|
SQL 关系型数据库 MySQL
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(中)
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(中)
20 张图搞懂「分布式事务」 | 🏆 技术专题第五期征文(中)