分布式事物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.rhkb.cn/news/490305.html

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

相关文章

深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器 1、激活函数1.1、一些常见的激活函数1.1.1、sigmoid1.1.2、softmax1.1.3、tanh1.1.4、ReLU1.1.5、Leaky ReLU1.1.6、PReLU1.1.7、GeLU1.1.8、ELU 1.2、激活函数的特点1.2.1、非线性1.2.2、几乎处处可微1.2.3、计算简单1.2.4、非饱和性1…

opencv-python的简单练习

1、读取一张彩色图像并将其转换为灰度图。 import cv2 img cv2.imread("../1iamge/a.jpg") # 灰度化 img_gray cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) cv2.imshow(img, img) cv2.imshow(img_gray, img_gray) cv2.waitKey(0) 2、编写程序,读取一张彩色…

Java、鸿蒙与嵌入式开发:技术选择与职业发展分析

在当今快速发展的科技领域中,Java、鸿蒙和嵌入式开发代表着不同的技术方向和职业机遇。每个方向都有其独特的市场价值和发展前景,让我们深入分析这三个领域的特点、发展趋势和职业规划。 Java开发方向已经发展了二十多年,仍然在软件开发领域…

【mybatis】缓存

目录 1. mybatis的运行 1.1 引言 1.2 具体运行: 1.3 sqlSession 介绍local catch 2. 缓存 2.1 概念 2.2 使用缓存的原因 2.3 什么样的数据能使用缓存 3. Mybatis缓存 3.1 一级缓存 3.1.1 测试一级缓存 3.1.2 缓存失效的四种情况 $1 sqlSession不同 $…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多,在不同的地方会使用到不同类型的标签,了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)按照什么方式进行显示,比如:div标签会自己独占一行&a…

Unity类银河战士恶魔城学习总结(P178 Archer s arrow 弓箭手的箭)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节制作了一个弓箭手的箭 Arrow_Controller.cs 1.OnTriggerEnter2D方法 功能:检测箭矢与其他对象的碰撞。逻辑&#xff1…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型,这是一种基于T…

【C++游记】Vector的使用和模拟实现

枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味&#xf…

Jenkins流水线初体验(六)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…

Android后端签到flask迁移到rust的axum的过程-签到性能和便携

本次变更了以下内容: 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.在前端的人名下…

Python OCR文字识别api接口

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

.NET 6.0 中接入 Log4net 和 NLog

一、接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文件内容为 <?xml version"1.0" encoding"utf-8"?> <log4net> <!-- Define some output appe…

编写php项目所需环境

需要编写php项目&#xff0c;需要看到编写的代码展现的效果&#xff0c;这里我选择用xampp来展现 准备工作&#xff1a; https://learncodingfast.com/how-to-install-xampp-and-brackets/#Installing_and_Running_XAMPP xampp下载地址&#xff1a;https://www.apachefriends.…

树莓派Pico火灾报警器项目:基于火焰传感器、蜂鸣器与LED的C++实现

火灾是我们生活中一个不可忽视的安全隐患,而火灾报警系统在预防火灾和保障人员安全方面起着至关重要的作用。通过嵌入式技术,我们可以实现一个简单而有效的火灾报警装置。在本项目中,我们将利用 树莓派Pico 控制 火焰传感器、LED 和 蜂鸣器,模拟火灾报警装置的工作原理。本…

数学建模问题中的多目标规划

多目标规划&#xff08;Multi-Objective Optimization, MOO&#xff09;是指在优化问题中同时优化多个相互冲突的目标函数的情况。与单目标优化问题不同&#xff0c;多目标优化的解通常不再是唯一的&#xff0c;而是一个解的集合&#xff0c;称为帕累托最优解集。这些解在所有目…

智汇云舟4个案例入选“中国联通智慧城市物联感知与AI应用案例”

12月10日&#xff0c;由中国联通智慧城市军团联合联通数字科技有限公司物联网事业部、物联中国团体组织联席会共同主办的“中国联通首届智慧城市领域物联感知与AI应用优秀案例发布交流大会”在郑州举行。大会现场对50余个优秀案例进行了集中发布与表彰。智汇云舟凭借深厚的技术…

【JavaEE】网络(1)

&#x1f435;本篇文章开始讲解计算机网络相关的知识 一、基础概念 1.1 局域网和广域网 局域网→Local Area Network→简称LAN&#xff0c;局域网是局部组建的一种私有网络&#xff0c;局域网内的主机之间可以进行网络通信&#xff0c;局域网和局域网之间在没有连接的情况不能…

Unity 模板测试透视效果(URP)

可以实现笼中窥梦和PicoVR中通过VST局部透视效果。 使用到的Shader: Shader "Unlit/StencilShader" {Properties{[IntRange]_Index("Stencil Index",Range(0,255))0}SubShader{Tags{"RenderType""Opaque""Queue""Geo…

川渝地区软件工程考研择校分析

通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西南交通大学软件工程学硕。该校24届软件工程学硕实际录取1…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…