分布式事物XA、BASE、TCC、SAGA、AT

分布式事务——Seata

一、Seata的架构:

1、什么是Seata:

它是一款分布式事务解决方案。官网查看:Seata

2.执行过程

在分布式事务中,会有一个入口方法去调用各个微服务,每一个微服务都有一个分支事务,因此调用了多少个微服务,全局事务就有多少个分支事务,TM代理这个入口方法,因此就定义了全局事务的范围

当入口方法被执行时,TM会先拦截这个方法的执行会先想TC发送一个请求,注册这个全局事务(开启全局事务请求),然后既可以开始执行这个入口的业务逻辑了,开始调用每一个微服务。到了微服务里面,每个分支事务就开始执行,这个时候RM就会代理分支业务在分支业务执行之前向TC注册分支事务,然后开始执行分支业务。在执行完成后,有RM向TC报告分支事务的状态。

因此,TC就知道了所有的分支事务的状态,然后等到全部分支业务执行完成TM向TC发送全局事务状态的时候TC就会检查分支事务的状态,如果都成功,就让各个分支事务都去提交,如果失败就让它们都回滚

二、部署TC服务,微服务集成Seata:

在上图中可以知道,TM和RM其实是对业务方法的代理和管理,而TC是脱离业务之外的一个服务,由它去协调TM和RM,协调全局事务和分支事务。

三、XA模式:

1、认识:

XA规范是分布式事务处理标准,它描述了全局的TM和局部的RM之间的接口,几乎所有的主流的数据库都对XA规范提供了支持;

2、执行原理:

XA将分布式事务分为两个阶段,一个是准备阶段,一个是执行阶段

准备阶段: 事务协调者会向事务参与者RM发送一个请求,这里的RM其实是由数据库实现的,所以可以认为RM就是数据库。让数据库去执行事务,但执行完不要提交,而是把结果告知事务协调者

执行阶段: 事务协调者根据结果,通知RM回滚或者提交事务。


3、Seata的XA模式:

TM是分布式事务的入口,分别调用分支事务。

第一阶段:准备阶段

1.1-->1.2-->1.3-->1.4-->1.5

TM入口,向TC注册全局事务-->TM调用分支事务RM-->分支事务注册到TC-->RM调用执行分支业务sql-->RM报告给TC分支事务执行但未提交后状态

第二阶段:执行阶段

2.1-->2.2-->2.3

TM向TC发送事务状态(比如Commit),-->TC 检查各分支RM报告的状态-->都成功那就让各分支事务Commit,如果有一个失败,都回滚

4、总结:

优点:
这是一种强一致性的解决方案,因为每一个微服务都是基于各自的事务的,各自的事务是满足ACID的,而且等到大家都执行完了且都成功了才提交,所以全局事务是满足ACID的。

实现比较简单,因为很多数据库都实现了这种模式,使用Seata的XA模式只需要简单的封装上TM。

缺点:
第一阶段不提交,等到第二阶段再提交,但是等的过程中要占用数据库锁,如果一个分布式事务中跨越了很多个分支事务,则可能造成很多资源的浪费,使得别的请求无法访问,降低了可用性

依赖于数据库,对于如果有的数据库没有实现这种模式,则无法使用这个模式来实现分布式事务

5、实现:


四、TCC模式:

1、模式原理:

TCC的模式主要体现在分支服务的内部


2、优缺点:

幂等是一个数学与计算机科学概念。

  • 在数学中,幂等用函数表达式就是:f(x) = f(f(x))。比如求绝对值的函数,就是幂等的,abs(x) = abs(abs(x))
  • 计算机科学中,幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同

什么是幂等设计-CSDN博客


3、案例:

空回滚‌是指在分布式事务中,在没有调用参与方的 Try 方法的情况下,直接调用了二阶段的 Cancel 方法。这种情况通常发生在分布式事务的全局事务开启后,某个参与者分支在执行一阶段(Try)操作时由于宕机或网络异常等原因未能成功执行,但全局事务已经开启并需要推进到终态。此时,系统会调用该参与者的 Cancel 方法进行回滚操作,但由于 Try 方法未执行,这种回滚操作被称为空回滚‌。

空回滚的原因

空回滚的主要原因包括:

  1. 网络异常‌:在分布式系统中,网络异常可能导致某个分支的 Try 方法未能成功执行。
  2. 机器宕机‌:参与事务处理的服务器宕机也会导致 Try 方法未能执行。
  3. 全局事务超时‌:如果全局事务超时,系统会强制进行回滚操作,但由于 Try 方法未执行,导致空回滚。

防止空回滚的解决方案

为了防止空回滚,可以在 Cancel 方法中增加一个事务控制表来记录 Try 方法的执行状态。具体步骤如下:

  1. Try 方法执行时‌:在事务控制表中插入一条记录,表示一阶段执行了。
  2. Cancel 方法执行时‌:读取这条记录。如果记录不存在,说明 Try 方法没有执行,直接返回成功,避免空回滚‌

业务悬挂‌是指在分布式事务处理中,一个事务在执行过程中,由于某些原因导致事务分支在尝试提交或回滚时无法完成操作,从而使事务处于未决状态‌。这种情况通常是由于网络问题、资源锁定冲突、服务宕机等原因造成的‌。

业务悬挂的影响

业务悬挂会导致数据不一致,阻塞后续事务的执行,严重时可能会影响整个系统的正常运行‌1。具体来说,悬挂的事务会长时间占用资源,导致其他事务无法访问这些资源,从而产生阻塞和死锁的问题‌。

业务悬挂的对策

  1. 超时机制‌:设置合理的事务超时时间,超时后自动触发回滚,以避免事务长时间悬挂‌1。
  2. 事务补偿机制‌:实现事务补偿逻辑,当检测到事务悬挂时,可以手动或自动进行事务补偿‌。
  3. 服务监控和告警‌:增强系统的监控能力,对事务悬挂进行实时监控和告警,以便及时发现并处理问题‌

4、新概念:

空回滚:这个时候cancel不能报错,因为如果报错则seata会进行等待,然后再继续执行cancel,进而一直循环等待。


业务悬挂:


五、AT模式:

1、AT模式原理:

AT模式同样是分阶段提交的事务模型,不过弥补了XA模型中资源锁定周期过长的缺陷。


2、AT模式的脏读问题:

虽然AT模式的性能相比XA的性能有所提升,但是它也有自己的缺点:正是以为它执行完sql就直接提交了,在并发的情况下,就可能会出现问题:


3、全局锁:

全局锁:由TC(事务协调者)记录当前正在操作某行数据的事务,该事务持有全局锁,具备执行权。


4、全局锁和XA中事务不提交占用锁资源的区分:

XA中事务不提交,占用的是数据库的锁所有的crud的操作都会被限制
TC上的全局锁只是记录操作某张表的某行的全局事务,是由Seata管理的,对于不是Seata管理的相关事务,依旧可以直接操作数据表。比如由其他业务要修改同张表同行数据的其他字段,这个时候是可以的。

所以全局锁比XA中的锁的粒度要小

如果修改的还是同一个字段,虽然这种情况出现的概率很低,但是AT也有解决方案:因为它保存了两个快照。


5、优缺点:


6、实现:


六、SAGA模式:

1、Soga模式原理:

它是Seata提供的长事务解决方案,分为两个阶段:

  1. 直接提交本地事务;
  2. 如果成功:什么都不做;
  3. 如果失败:通过编写补偿业务来回滚;

2、优缺点:


七、四种模式的对比:

(二)分布式事务——Seata、XA、TCC、AT、SAGA模式_xa tcc saga-CSDN博客

(二)分布式事务——Seata、XA、TCC、AT、SAGA模式 - 姚春辉 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL为什么使用B+树来作索引

我来详细解释一下B树的结构和特点。 graph TDA[根节点 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[9…

python 下载 b站视频 和音频

video_bvid: import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

以太网链路详情

文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…

Shell编程 脚本的运行方式与注释

目录 shell脚本的运行方式 1. 路径运行 2.bash或sh加脚本运行 ​编辑 3.source在加脚本路径运行 shell脚本注释 单行注释 多行注释 shell脚本的运行方式 我们在/usr/etc/demo01目录下新建了一个脚本 a.sh ,脚本内容是要求输出数字1,怎么运行呢 1…

智算网络中Scale-out和Scale-up网络的技术原理

智算网络中Scale-out网络和Scale-up网络的本质区别是什么? 一、什么是智算中心的Scale-out网络和Scale-up网络 数据中心网络总体上可分为两大类:通算网络和智算网络。通算网络主要用于支持传统的计算任务和应用,如企业的IT系统、网站托管、电…

HCIA笔记7--OSPF协议入门

文章目录 0. 路由分类1. OSPF介绍1.1 概念1.2 报文类型 2. 邻接关系的建立2.1 邻居关系的建立2.2 邻接关系的形成2.3 ospf状态机 3. DR与BDR3.1 为什么要有DR和BDR?3.2 DR和BDR的选举原则 4. ospf的配置4.1 内部优先级 5. 问题5.1 三层环路如何解决? Ref…

mysql排序问题

mysql 建数据库时,需要指定 字符集 和 排序规则 建表时,也可以指定 也可以指定具体的字段 安照下面的sql顺序执行插入,它们的排序是什么样的? INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

vulhub复现CVE-2021-44228log4j漏洞

目录 一:漏洞概述 二:漏洞原理 三:漏洞利用 lookup功能: JNDI解析器: ldap服务: RMI: 四:漏洞复现 4.1靶场 4.2dnslog测试 4.3部署jndi-injection-exploit 4.4打开监听端口 4.5触发请…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中,我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而,有时我们会遇到“IP地址获取失败”的困扰,这不仅阻碍了我们的网络访问,还可能带来一系列的网络连接问题。那么,IP地址获取…

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下: //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

十一、容器化 vs 虚拟化-Docker

文章目录 前言一、Docker 介绍1. 简介2. 应用场景3. 特点4. Docker和虚拟机之间的区别5. 解决痛点1. 解决依赖兼容2. 解决操作系统环境差异3. 小结 二、Docker 架构三、工作流程五、Docker 核心组件及其工作机制1. Docker 客户端(Docker Client)2. Docke…

linux学习笔记01 基础命令

目录 创建 touch 创建文件 (创建但是不打开) vi / vim 创建文件 (创建一个文件并打开) mkdir 创建文件夹 切换目录 cd 查看 pwd 查看当前目录完整路径 ls 查看目录信息 dir 查看目录信息 ll 表示查看目标目录下的信息 ls -a 查看当前目录下的…

【深度学习】深刻理解多模态模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一个多模态模型,旨在学习视觉和语言的联合表示,能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行;当前是秒级时间戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况,就是爬虫最初是正常运行、正常抓取数据的,一切看起来都是那么美好,然而一杯茶的工夫就出现了错误,例如 403 Forbidden,这时打开网页一看,可能会看到“您的IP访问频率太…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…