目录

一、XA模式

【1】两阶段提交

【2】Seata的XA模型

【3】优缺点

【4】实现XA模式

二、AT模式

【1】Seata的AT模型

【2】AT与XA的区别

【3】脏写问题

【4】优缺点

【5】实现AT模式


一、XA模式

        XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准, XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA规范提供了支持。


【1】两阶段提交

XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。

正常情况:

异常情况:

⼀阶段:
  • 事务协调者通知每个事物参与者执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁
⼆阶段:
  • 事务协调者基于⼀阶段的报告来判断下⼀步操作
    • 如果⼀阶段都成功,则通知所有事务参与者,提交事务
    • 如果⼀阶段任意⼀个参与者失败,则通知所有事务参与者回滚事务

【2】Seata的XA模型

RM⼀阶段的工作:
  • 注册分支事务到TC
  • 执行分支业务sql但不提交
  • 报告执行状态到TC
TC⼆阶段的工作:
  • TC检测各分支事务执行状态
  • 如果都成功,通知所有RM提交事务
  • 如果有失败,通知所有RM回滚事务

RM⼆阶段的工作:
  • 接收TC指令,提交或回滚事务

【3】优缺点

XA模式的优点是什么?
  • 事务的强⼀致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵⼊
XA模式的缺点是什么?
  • 因为⼀阶段需要锁定数据库资源,等待⼆阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

【4】实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加@GlobalTransactional注解:

本例中是OrderServiceImpl中的create方法.

3)重启服务并测试

重启order-service,再次测试,发现无论怎样,微服务都能成功回滚。


二、AT模式

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

【1】Seata的AT模型

基本流程图:

阶段⼀RM的工作:

  • 注册分支事务

  • 记录undo-log(数据快照)

  • 执行业务sql并提交

  • 报告事务状态

阶段⼆提交时RM的工作:

  • 删除undo-log即可

阶段⼆回滚时RM的工作:

  • 根据undo-log恢复数据到更新前


【2】AT与XA的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式⼀阶段不提交事务,锁定资源;AT模式⼀阶段直接提交,不锁定资源。

  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。

  • XA模式强⼀致;AT模式最终⼀致


【3】脏写问题

在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题,如图:

        解决思路就是引入了全局锁的概念在释放DB锁之前,先拿到全局锁,避免同⼀时刻有另外⼀个事务来操作当前数据。


【4】优缺点

AT模式的优点:
  • ⼀阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵⼊,框架自动完成回滚和提交
AT模式的缺点:
  • 两阶段之间属于软状态,属于最终⼀致
  • 框架的快照功能会影响性能,但比XA模式要好很多

【5】实现AT模式

        AT模式中的快照生成、回滚等动作都是由框架自动完成,没有任何代码侵入,因此实现非常简单。 只不过,AT模式需要⼀个表来记录全局锁、另⼀张表来记录数据快照undo_log。

1)导入数据库表,记录全局锁

运行seata-at.sql,其中lock_table导入到TC服务关联的数据库,undo_log表导⼊到微服务关联的数据库:

2)修改application.yml文件,将事务模式修改为AT模式即可:
seata:data-source-proxy-mode: AT # 默认就是AT

3)重启服务并测试


        感谢你花时间读到这里~ 如果你觉得这篇内容对你有帮助,不妨点个赞让更多人看到;如果有任何想法、疑问,或者想分享你的相关经历,欢迎在评论区留言交流,你的每一条互动对我来说都很珍贵~ 我们下次再见啦!😊😊

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

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

相关文章

CTFHub SSRF通关笔记6:Gopher Redis原理详解与渗透实战

目录 一、SSRF Gopher Redis 1、功能简介 2、攻击原理 (1)SSR的作用 (2)Gopher 协议特性 (3)攻击 Redis 步骤 二、gopherus 1、功能简介 2、攻击Redis服务方法 三、Gopherus安装 1、源码下载 2…

数据结构之二叉树(2)

数据结构之二叉树(2)1.二叉树的存储结构2.实现顺序结构二叉树2.1何为堆2.2堆的性质2.3堆的定义2.3堆的初始化与销毁3.1向上调整算法3.2向下调整算法4.入堆5.出堆让花成花,让树成树上一次我们学习了树的分类,并初步了解了二叉树。今…

Linux操作系统之Ubuntu

Ubuntu是基于Debian的开源Linux发行版,由Canonical公司维护,以用户友好性和稳定性著称。它广泛应用于个人电脑、服务器及云计算环境,支持多种硬件架构。Ubuntu的特点Ubuntu提供定期更新版本(每6个月)和长期支持版本&am…

kotlin的函数前面增加suspend关键字的作用

deepseek回答: Kotlin中suspend关键字的作用详解 核心作用 suspend关键字用于标记‌挂起函数‌,使其能够在协程中实现非阻塞的异步操作。 suspend关键字的本质作用 suspend关键字的主要作用是‌标记一个函数为挂起函数‌,使其能够在协程中使用…

Vibe Coding实战项目:用Qwen3-Coder做了个AI跳舞视频生成器

大家好,这里是K姐。 一个 Vibe Coding 的探索者。 前段时间发现通义发起了一个Qwen3-Coder挑战赛,最高奖金有10000元,研究了一下,我发现这个赛道太宽了,不限项目,用 AI Coding 做数据分析、个人Blog、抓取…

Kafka面试精讲 Day 13:故障检测与自动恢复

【Kafka面试精讲 Day 13】故障检测与自动恢复 在“Kafka面试精讲”系列的第13天,我们将深入探讨 Kafka 高可用体系中的关键一环:故障检测与自动恢复机制。作为分布式系统的核心能力,Kafka 如何在 Broker 宕机、网络分区或磁盘故障时快速感知…

【前沿技术拓展Trip Two】具身智能

具身智能(Embodied AI)的认识,进展,以及为何难以实现 在讲具身智能之前,我们不得不先行介绍一下离身智能与离身认识系统这两个极其相关且更加常见的概念 离身认识系统 其实目前绝大多数的AI,例如DeepSeek&a…

使用electron将vue3网页项目包装成pc客户端

一、准备前工作在项目的根目录 打开命令行工具 安装四个依赖库安装报错的话二、准备工作完成之后,在项目根目录需要有俩个文件在项目根目录创建electron文件夹在vite.config.js中添加配置项在package.json中添加配置项运行命令 npm run electron:build 打包关于mac&…

基于安全抽象模型(SAM)的汽车网络安全防御与攻击分析

摘要自动驾驶汽车比以往任何一种个人出行交通工具都具有更大的受攻击可能性。这主要是因为这类汽车对通信有极高的需求,一方面是出于功能和安全方面的考虑,另一方面则是为了满足舒适性需求。无人驾驶汽车需要与周围环境进行通信的接口、直接连接&#xf…

线扫相机不出图原因总结

1、帧触发信号有问题 线扫相机出图由帧信号决定开始采集,如果没有帧信号线扫相机无法识别开始信号,所以不出图 1)没有给相机帧信号 帧信号是一个短暂的脉冲信号,持续时间不要太长,相机能识别就可以,一般由plc或者控制卡的数字量输出口触发,可以通过监测数字量输出口来确…

开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和

需求 对int,long类型的数据求和直接用stream().mapToInt()、stream().mapToDouble(),可是没有stream().mapToBigDecimal()这样的方法,那么如何用stream对List的BigDecimal字段进行求和? 代码实现 直接上代码 public class OrderIn…

pycharm如何处理python项目间引用

1. 如何在pycharm中将其它项目添加到打开的项目中 如图所示:文件->打开->附加(Attach)即可2.如何引用:直接作为一个普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何编译这种引用其它项目的可执行文…

家庭劳务机器人发展阶段与时间预测

家庭劳务机器人大规模进入家庭不会是一个单一的时间点,而是一个分阶段、渐进式的过程。我们可以将这个进程分为以下几个阶段,并对每个阶段的时间线进行预测:第一阶段:单一功能机器人普及(现在 - 2025年)这个…

Zynq开发实践(FPGA之spi实现)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】虽然串口用的地方比较多,实现起来也比较简单。但是串口本身速度比较慢,不利于高速数据通信。而且单个串口没有办法和很多芯片…

指甲打磨机/磨甲器MCU控制方案开发,轻松解决磨甲问题

美甲打磨机/指甲打磨机核心功能需求 1. 基础功能 无级调速(5,000-30,000 RPM,PWM控制) 正反转切换(可选,用于抛光/去角质) 按键锁/防误触(长按3秒解锁) 锂电池管理(3.7V单节,带充电指…

临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 摘要 随着电子健康记录(EHR)的普…

二进制安装MySQL 8.0指南:跨平台、自定义数据路径、安全远程访问配置

二进制安装 MySQL 8.0 在生产或测试环境中,我们常常希望避免包管理器带来的依赖和交互问题,尤其是当系统自带版本过旧或安装过程频繁弹窗时。此时,使用 MySQL 官方提供的二进制压缩包(Generic Linux Binary) 进行安装…

Z检验与T检验的区别与联系:原理、公式和案例全解

Z检验与T检验全解析:原理、区别与实际案例 统计学的核心任务之一,就是通过有限的样本数据去推断总体特征。在这一过程中,假设检验成为了最常见的工具。而在众多检验方法中,Z检验与T检验几乎是入门必学,也是应用最广泛的…

SpringBoot之缓存(最详细)

文章目录项目准备新建项目并选择模块安装添加依赖添加application.yml删除demos.web包编写pojo层userdto/ResultJson编写mapper层UserMapper编写service层UserService编写controller层编写配置类MybatisPlusConfig编写测试类1 缓存分类1.1 MyBatis一级缓存1.2 MyBatis二级缓存1…

B站 韩顺平 笔记 (Day 29)

目录 1(集合的框架体系) 2(Collection接口和常用方法) 2.1(Collection接口实现类特点) 2.2(常用方法) 2.3(遍历元素方式1:迭代器) 1&#x…