使用Seata实现分布式事务真香!

之前分享了六种分布式事务方案:

本地消息表:如何通过本地消息表实现分布式事务

最大努力通知:如何使用最大努力通知实现分布式事务?与本地消息表区别?

XA模式:用二阶段三阶段提交实现分布式事务

TCC模式:如何用TCC实现分布式事务?

RocketMQ:使用RocketMQ实现分布式事务

Saga模式:如何用saga实现分布式事务?

面对这么多的实现方式,那么有没有一个统一的方案来简化这些呢?今天我们来学习一下Seata,它如何使复杂的分布式事务管理变得简单?

Seata:分布式事务的利剑

Seata(Simple Extensible Autonomous Transaction Architecture)是阿里一个开源的分布式事务解决方案,旨在提供高性能和易用的分布式事务服务。Seata解决了微服务架构下不同服务间数据一致性的问题,让开发者能够更加专注于业务逻辑。

Seata 主要包括以下三个核心组件:

  1. Transaction Coordinator (TC):事务协调器,维护全局和分支事务的状态,驱动全局事务的提交或回滚。作为服务单独部署。

  2. Transaction Manager (TM):事务管理器,定义全局事务的范围:开始全局事务、提交或回滚全局事务。

  3. Resource Manager (RM):资源管理器,管理分支事务处理的资源,与 TC 通信以注册分支事务和报告分支事务的状态,并驱动分支事务的提交或回滚。

工作流程

  1. 开始事务:TM 请求 TC 开启一个新的全局事务。TC 生成一个全局唯一的事务ID。

  2. 业务执行:在全局事务内,微服务可以调用其他微服务。当本地事务被执行时,RM 会向 TC 注册相应的分支事务。

  3. 提交或回滚:根据业务执行的结果,TM 会通知 TC 提交或回滚全局事务。TC 则会协调所有参与当前全局事务的 RM,驱动所有分支事务的提交或回滚。

Seata 的事务模式

Seata 支持四种事务模式,以应对不同的业务场景:

1. AT 模式(自动提交模式)

AT 模式是一种无侵入式的分布式事务解决方案,主要用于简化开发者对分布式事务的处理。需要创建一个`undo_log`表。

图片

  • 第一阶段:分支事务利用 RM 模块中对 JDBC 数据源代理,加入了若干流程,对业务 SQL 进行解释,把业务数据在更新前后的数据镜像组织成回滚日志,并生成 undo log 日志,对全局事务锁的检查以及分支事务的注册等,利用本地事务 ACID 特性,将业务 SQL 和 undo log 写入同一个事务中一同提交到数据库中,保证业务 SQL 必定存在相应的回滚日志,最后对分支事务状态向 TC 进行上报。这个跟MySQL的undo log是不是有点类似。

  • 第二阶段:

    • TM决议全局提交:当 TM 决议提交时,就不需要同步协调处理了,TC 会异步调度各个 RM 分支事务删除对应的 undo log 日志即可,这个步骤非常快速地可以完成。这个机制对于性能提升非常关键,我们知道正常的业务运行过程中,事务执行的成功率是非常高的,因此可以直接在本地事务中提交,这步对于提升性能非常显著。

    • TM决议全局回滚:当 TM 决议回滚时,RM 收到 TC 发送的回滚请求,RM 通过 XID 找到对应的 undo log 回滚日志,然后利用本地事务 ACID 特性,执行回滚日志完成回滚操作并删除 undo log 日志,最后向 TC 进行回滚结果上报。

2. TCC 模式(Try-Confirm-Cancel 模式)

TCC 是一种更加灵活的分布式事务处理模式,需要开发者显式地定义事务的三个阶段:Try、Confirm 和 Cancel。可以参考:如何用TCC实现分布式事务?

图片

  • Try 阶段:尝试执行业务操作,检查系统资源是否足够,并对必要的资源进行预留。

  • Confirm 阶段:如果 Try 阶段成功,Confirm 阶段会正式提交业务操作,利用 Try 阶段预留的资源完成实际的业务逻辑。

  • Cancel 阶段:如果业务执行失败,或者是其他业务分支失败导致需要回滚,Cancel 阶段会被触发,用于释放 Try 阶段预留的资源,并撤销执行的操作。

之前我们了解到TCC模式会出现空回滚与事务悬挂,那么Seata是如何处理的呢?

  • Seata 是怎么处理空回滚的呢?

       Seata 的做法是新增一个 TCC 事务控制表,包含事务的 XID 和 BranchID 信息,在 Try 方法执行时插入一条记录,表示一阶段执行了,执行 Cancel 方法时读取这条记录,如果记录不存在,说明 Try 方法没有执行。

    Seata 是怎么处理悬挂的呢?

       Seata在 TCC 事务控制表记录状态的字段 status 中增加一个状态: suspended:4 当执行二阶段 Cancel 方法时,如果发现 TCC 事务控制表没有相关记录,说明二阶段 Cancel 方法优先一阶段 Try 方法执行,因此插入一条 status=4 状态的记录,当一阶段 Try 方法后面执行时,判断status=4 ,则说明有二阶段 Cancel 已执行,并返回 false 以阻止一阶段 Try 方法执行成功。

3. Saga 模式(长事务模式)

Saga 模式适用于长时间运行的业务流程,将一个大的分布式事务拆分为多个子事务,每个子事务都有其对应的补偿操作。可以参考:如何用saga实现分布式事务?

图片

  • 原理:在 Saga 模式中,事务被分解为一系列的局部事务,每个局部事务都有对应的正向操作(业务逻辑)和反向操作(补偿逻辑)。正向操作用于执行业务逻辑,反向操作用于在事务执行失败时回滚已执行的操作。

  • 执行流程:正向操作按照预定的顺序执行。如果所有局部事务都成功,那么整个 Saga 事务成功。如果某个局部事务失败,之前执行的局部事务会按照相反的顺序执行其反向操作,以达到回滚的效果。

4.XA模式

XA 模式是从 1.2 版本支持的事务模式。XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。Seata XA 模式是利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。可以参考:用二阶段三阶段提交实现分布式事务

在 Seata 的 XA 模式中,Seata 作为事务协调器,负责实现两阶段提交协议,管理参与分布式事务的多个资源管理器。XA的RM(资源管理器)通常是指数据库,而Seata的RM是作为客户端与AP集成在一起,AP创建RM。在第一阶段,资源管理器准备事务并锁定资源;在第二阶段,根据协调器的指令提交或回滚事务。整体流程如下:

  1. TM 向 TC 请求发起(Begin)、提交(Commit)、回滚(Rollback)全局事务。

  2. TM 把代表全局事务的 XID 绑定到分支事务上。

  3. RM 向 TC 注册,把分支事务关联到 XID 代表的全局事务中。

  4. RM 把分支事务的执行结果上报给 TC。(可选)

  5. TC 发送分支提交(Branch Commit)或分支回滚(Branch Rollback)命令给 RM

图片

总结

  1. 一致性保证:Seata 保证了分布式事务的一致性,即使在复杂的分布式场景中也能确保数据的一致性。

  2. 易于集成:Seata 提供了对多种流行分布式事务的集成能力,使在微服务架构中使用分布式事务变的简单。

  3. 高可用和可扩展:Seata 设计了高可用和可扩展性,可以支持大规模的微服务架构。

在微服务架构中处理分布式事务是一个复杂的问题,但 Seata 提供了一个简单有效的解决方案。通过理解 Seata 的核心组件和工作流程,开发者可以更加自信地在自己的微服务项目中实现分布式事务管理。

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

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

相关文章

解析编程中不可或缺的基础:深入了解结构体类型

精琢博客,希望可以给大家带来收获~ 博主主页:17_Kevin-CSDN博客 收录专栏:《C语言》 引言 在编程中,结构体是一种自定义的数据类型,它允许开发人员将不同类型的数据组合在一起,并为其定义相关属性和行为。…

uniapp 跳转返回携带参数(超好用)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.返回界面 uni.$emit(enterPeople, this.entryList)uni.navigateBack({delta: 1}) 2.返回到的界面(接收数据界面) onShow() {let that thisuni.$on(enterPeople,function(enterPeopledata){console.…

YOLOv8 | 添加注意力机制报错KeyError:已解决,详细步骤

目录 添加注意力机制报错 报错的原因 注意事项 解决错误流程 代码分享 ⭐欢迎大家订阅我的专栏一起学习⭐ 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 YOLOv5涨点专栏:h…

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类 工作原理关键组件以TomcatServletWebServerFactory为例ServletWebServerFactory会创建webServer的时机关键…

25考研数据结构复习·3.2队列

队列(Queue)基本概念 定义 队列(Queue)时只允许在一端进行插入,在另一端删除的线性表。 特点:先进入队列的元素先出队 先进先出 First In First Out(FIFO) 重要术语 队头、队尾、空队列 基本操作 创、销 I…

页面配置、网络数据请求

1. 页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中, app.json 中的 window 节点,可以全局配置小程序中每个页面的窗口…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 &#xff08;1&#xff09;二叉树可以是一个节点的有限集合 &#xff08;2&#xff09;可以为空 &#xff08;3&#xff09;或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 &#xff08;4&#xff09;二叉树的每一个节点…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…

力扣100题—持续更新

目录 LC141环形列表(easy)题目描述方法1&#xff1a;快慢指针&#xff08;1&#xff09;思路&#xff08;2&#xff09;python代码&#xff08;3&#xff09;复杂度分析 LC881救生艇&#xff08;medium&#xff09;题目描述方法1&#xff1a;双指针-对撞指针&#xff08;1&…

柚见第十二期(随机匹配)

随机匹配 目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个&#xff1f; 答&#xff1a;匹配多个&#xff0c;并且按照匹配的相似度从高到低排序 怎么匹配&#xff1f;&#xff08;根据什么匹配&#xff09; 答&#xff1a;标签 tags 还可以根据 us…

分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸

分享一下自己总结的7万多字java面试笔记和一些面试视频&#xff0c;简历啥的&#xff0c;已大厂上岸 自己总结的面试简历资料&#xff1a;https://pan.quark.cn/s/8b602fe53b58 文章目录 SSMspringspring 的优点&#xff1f;IoC和AOP的理解**Bean 的生命周期****列举一些重要…

一命通关差分

本章节是前缀和的延申 一命通关前缀和-CSDN博客https://blog.csdn.net/qq_74260823/article/details/136530291?spm1001.2014.3001.5501 一命通关前缀和 公交车 引入 还是利用我们在前缀和中所采用的例子——公交车。 有一辆公交车&#xff0c;一共上下了N批乘客&#xff1a…

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

RabbitMQ 面试题及答案整理,最新面试题

RabbitMQ的核心组件有哪些&#xff1f; RabbitMQ的核心组件包括&#xff1a; 1、生产者&#xff08;Producer&#xff09;&#xff1a; 生产者是发送消息到RabbitMQ的应用程序。 2、消费者&#xff08;Consumer&#xff09;&#xff1a; 消费者是接收RabbitMQ消息的应用程序…

哥斯拉流量webshell分析-->ASP/PHP

哥斯拉流量webshell分析 哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器&#xff0c;这里就不过多介绍了。 哥斯拉GitHub地址&#xff1a;https://github.com/BeichenDream/Godzilla 很多一线师傅不太了解其中的加解密手法&#xff0c;无法进行解密&#xff0c;这篇文章…

Web3社交项目UXLINK零撸教程

简介&#xff1a;UXLINK是Web3行业中首个主打双向、熟人社交关系的产品&#xff0c;与其他社交基础设施类项目相比&#xff0c;类似Twitter Vs Facebook、微博 Vs 微信的社交结构区别。UXLINK的愿景&#xff1a;1、社交中心&#xff1a;成为最大的社交平台&#xff0c;专注于真…

goctl-swagger 生成json接口文件

参考&#xff1a; GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境&#xff0c;不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…