分布式事物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 方法未执行,这种回滚操作被称为空回滚。
空回滚的原因
空回滚的主要原因包括:
- 网络异常:在分布式系统中,网络异常可能导致某个分支的 Try 方法未能成功执行。
- 机器宕机:参与事务处理的服务器宕机也会导致 Try 方法未能执行。
- 全局事务超时:如果全局事务超时,系统会强制进行回滚操作,但由于 Try 方法未执行,导致空回滚。
防止空回滚的解决方案
为了防止空回滚,可以在 Cancel 方法中增加一个事务控制表来记录 Try 方法的执行状态。具体步骤如下:
- Try 方法执行时:在事务控制表中插入一条记录,表示一阶段执行了。
- Cancel 方法执行时:读取这条记录。如果记录不存在,说明 Try 方法没有执行,直接返回成功,避免空回滚
业务悬挂是指在分布式事务处理中,一个事务在执行过程中,由于某些原因导致事务分支在尝试提交或回滚时无法完成操作,从而使事务处于未决状态。这种情况通常是由于网络问题、资源锁定冲突、服务宕机等原因造成的。
业务悬挂的影响
业务悬挂会导致数据不一致,阻塞后续事务的执行,严重时可能会影响整个系统的正常运行1。具体来说,悬挂的事务会长时间占用资源,导致其他事务无法访问这些资源,从而产生阻塞和死锁的问题。
业务悬挂的对策
- 超时机制:设置合理的事务超时时间,超时后自动触发回滚,以避免事务长时间悬挂1。
- 事务补偿机制:实现事务补偿逻辑,当检测到事务悬挂时,可以手动或自动进行事务补偿。
- 服务监控和告警:增强系统的监控能力,对事务悬挂进行实时监控和告警,以便及时发现并处理问题

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提供的长事务解决方案,分为两个阶段:
- 直接提交本地事务;
- 如果成功:什么都不做;
- 如果失败:通过编写补偿业务来回滚;
2、优缺点:

七、四种模式的对比:

(二)分布式事务——Seata、XA、TCC、AT、SAGA模式_xa tcc saga-CSDN博客
(二)分布式事务——Seata、XA、TCC、AT、SAGA模式 - 姚春辉 - 博客园
相关文章:
分布式事物XA、BASE、TCC、SAGA、AT
分布式事务——Seata 一、Seata的架构: 1、什么是Seata: 它是一款分布式事务解决方案。官网查看:Seata 2.执行过程 在分布式事务中,会有一个入口方法去调用各个微服务,每一个微服务都有一个分支事务,因…...
域名信息收集(小迪网络安全笔记~
附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.1 域名信息收集 引子:上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时,其域名信息该如何收…...
力扣-图论-13【算法学习day.63】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
【设计模式】如何用C++实现观察者模式【发布订阅机制】
【设计模式】如何用C实现观察者模式【发布订阅机制】 一、问题背景 代码质量影响生活质量。最近工作中频繁接触各种设计模式,深刻体会到优秀的设计模式不仅能显著降低后续维护的压力,还能提升开发效率。观察者模式作为一种降低耦合度、提高扩展性的利器…...
【LC】2717. 半有序排列
题目描述: 给你一个下标从 0 开始、长度为 n 的整数排列 nums 。 如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列 : 选择 nums 中相邻的两…...
AI智算-k8s部署大语言模型管理工具Ollama
文章目录 简介k8s部署OllamaOpen WebUI访问Open-WebUI 简介 Github:https://github.com/ollama/ollama 官网:https://ollama.com/ API:https://github.com/ollama/ollama/blob/main/docs/api.md Ollama 是一个基于 Go 语言开发的可以本地运…...
CloudberryDB(二) 演化路线图
CloudberryDB 制定了演化路线图(https://github.com/orgs/cloudberrydb/discussions/369)并在逐步改进,这是 Cloudberry Database 发挥独特价值之处。 计划、正在进行或已完成的一些工作。 支持轻松升级 PostgreSQL 内核版本。 原有 Greenp…...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...
实现canal监控binlog日志再通过消息队列异步处理
一、简单步骤 实现Canal监控Binlog日志,并通过消息队列进行异步处理,步骤如下: 配置Canal:首先,需要配置Canal进行Binlog日志监控。可以通过Canal的官方文档了解如何配置Canal。 连接到Canal:使用Canal客户…...
Linux DNS 协议概述
1. DNS 概述 互联网中,一台计算机与其他计算机通信时,通过 IP 地址唯一的标志自己。此时的 IP 地址就类似于我们日常生活中的电话号码。但是,这种纯数字的标识是比较难记忆的,而且数量也比较庞大。例如,每个 IPv4 地址…...
linux打包qt程序
参考这篇文章:Linux下Qt程序打包_linuxdeployqt下载-CSDN博客 本篇文章的系统环境是 : 虚拟机ubuntu18.04 用下面这个qmake路径 进行编译 在 ~/.bashrc 文件末尾,qmake目录配置到文件末尾 将上图中bin目录下的linuxdeployqt程序拷贝到/usr/bin下一份 &…...
软考中级-软件设计师通过心路经验分享
执念,第四次终于通过了 没买书,下班后每天2小时,四个2个月终于过了 学习经验: 1.下班后学习真的靠毅力,和上学的时候考证不是一个状态,大家要及时调整,否则过程很痛苦 2.失败三次的经验…...
safe area helper插件
概述 显示不同机型的必能显示的区域 实现步骤 引入safearea,引入其中的safearea的csharp 为cancas加入gameobject gameobject中加入safearea脚本 将UI作为这个gameobject的子物体,就可以完成显示...
李宏毅机器学习-批次 (batch)和动量(momentum)
一.batch(批次) 在计算微分时,不是对所有的数据算出来的Loss值做微分,而是将所有的数据分成一个一个的batch。一个batch是一个B,在更新参数时,拿B的资料计算Loss,计算gradient,再更新…...
C# 网络编程--关于UDP 通信(二)
UDP (User Datagram Protocol) 是一种无连接的传输层协议,主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。 1.UDP协议基本概念 1.udp基于IP的简单的协议,不可靠的协议 2.优点:简单、 轻量化、 传输速度高、…...
【k8s集群应用】Kubernetes部署安装-二进制部署实例
文章目录 Kubernetes 部署方式常见的K8S安装部署方式Kubeadm与二进制部署的区别 Kubernetes部署安装环境配置Kubernetes集群初始化配置(实验环境)一、操作系统初始化配置二、部署Docker引擎 etcd 集群搭建配置 etcd 集群 Kubernetes Master 组件部署准备…...
js常见代码输出问题之promise,await,变量提升以及闭包(包括例子以及详细解析)
这里写目录标题 异步事件循环宏任务微任务1. 执行顺序2. 分类 Promise代码输出1. promise.then执行时机2. 宏任务微任务的多轮次3. .then .catch会返回新的promise4. 返回任意一个非 promise 的值都会被包裹成 promise 对象5. .then .catch 的值不能是promise本身6. 值透传7. .…...
遗传算法与深度学习实战(27)——进化卷积神经网络
遗传算法与深度学习实战(27)——进化卷积神经网络 0. 前言1. 自定义交叉算子2. 自定义突变操作符3. 进化卷积神经网络小结系列链接 0. 前言 DEAP toolbox 中提供的标准遗传操作符对于自定义的网络架构基因序列来说是不够的。这是因为任何标准的交叉算子…...
【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理
强烈推荐这篇博客!非常全面的一篇文章,本文是对该博客的简要概括和补充,在不同技术栈中提供一种可行思路,可先阅读该篇文章再阅读本篇: FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBu…...
基础算法——前缀和
由于比赛基本都是采用Dev-C所以,算法篇基本都是采用Dev-C来解释(版本5.11,c11) 首先介绍一下前缀和算法 给定一个数组,有q次询问,每次询问: 两个整数l,r,求出数组 l 到 r的结果 遇…...
RoPE → Attention 完整
好的,我帮你把之前的 “Transformer 输入 → RoPE → Attention” 全流程整理成一个完整的、连贯的文档。每一步都包含 数学表达 PyTorch 示例代码,方便直接参考或实现。Transformer 前向 RoPE 全流程1️⃣ 输入:Token → Embedding 数学表…...
PCBA加工中极性元件的识别与防错指南
1. 极性元件在PCBA加工中的重要性在PCBA(印刷电路板组装)加工过程中,极性元件就像电路中的"单行道"——方向错了,整个系统就会瘫痪。作为一名有十年经验的电子工程师,我见过太多因为极性元件反向导致的批量性…...
如何快速实现文件格式伪装?apate工具完整使用指南
如何快速实现文件格式伪装?apate工具完整使用指南 【免费下载链接】apate 简洁、快速地对文件进行格式伪装 项目地址: https://gitcode.com/gh_mirrors/apa/apate 在当今数字时代,文件格式伪装技术已经成为保护数据隐私和突破平台限制的重要工具。…...
华人辍学博士揪出Claude Code 51万行源码泄露,官方请求下架超8000个GitHub代码库并回应:这次是人为失误,无人被解雇!
整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 这两天 AI 圈的热点话题,莫过于 Claude Code 51 万行核心源码意外泄露事件。而这场风波的起点,并非什么高明的黑客攻击、也没有复杂的攻击路径,而是一位安全研究员的…...
javaweb高校两校区通勤校车预约系统的设计与实现 论文
目录同行可拿货,招校园代理 ,本人源头供货商功能需求分析用户管理校车班次管理预约功能核销与签到数据统计通知系统技术实现要点前端设计后端逻辑数据库设计安全机制项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招…...
Claude封号潮下的开发者生存指南:从源码泄露到合规中转的全解析
📌 全文速览:本文深度拆解2026年春季席卷AI编程圈的Claude账号封禁浪潮以及Anthropic源码泄露事件,从技术根源到社区自救,再到终极解决方案,为你呈现AI开发者生存指南。Claude封号潮下的开发者生存指南:从源…...
C++ 动态内存管理深度解析:new/delete 完全指南
引言在 C 语言中,我们使用 malloc()、calloc()、realloc() 和 free() 来管理动态内存。而 C 引入了全新的动态内存管理方式——new 和 delete。这不仅带来了语法上的简化,更重要的是引入了类型安全和初始化的概念。在学习过程中,我对 new 的理…...
Elsevier Tracker:学术审稿状态自动化追踪解决方案
Elsevier Tracker:学术审稿状态自动化追踪解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker Elsevier Tracker是一款开源Chrome插件,专为学术研究者设计,提供Elsevier期刊审…...
打造专业视频编辑App时间线:基于android-advancedrecyclerview的终极拖拽实现指南
打造专业视频编辑App时间线:基于android-advancedrecyclerview的终极拖拽实现指南 【免费下载链接】android-advancedrecyclerview RecyclerView extension library which provides advanced features. (ex. Googles Inbox app like swiping, Play Music app like d…...
HDD与SSD终极对决:性能、成本与应用场景全解析
1. HDD与SSD:从构造看本质差异 第一次拆开电脑主机时,看到那个嗡嗡作响的金属盒子(HDD)和旁边安静的电路板(SSD),我就意识到它们是完全不同的物种。HDD就像老式留声机,数据存储在高速…...
