使用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,一经查实,立即删除!

相关文章

【820复试】数据结构面试问题

文章目录 1.用循环比递归的效率高吗2.顺序表和链表的比较3.头指针和头结点的区别4.如何区分循环队列是队满还是队空?5.栈在通过后缀表达式求值的算法思想6.栈在递归中的应用7.队列在层次遍历中的作用8.队列在计算机系统中的应用9.矩阵的压缩存储10.串的模式匹配11.如…

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

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

服务端出现大量的time_wait,如何排差和解决?

出现大量的TIME_WAIT状态通常是由于网络连接的频繁创建和关闭所导致的。TIME_WAIT状态是TCP连接关闭后的一种状态,在该状态下,连接的端口在一段时间内仍然被保留,以确保延迟的数据包不会在网络中出现问题。 要排查和解决大量的TIME_WAIT状态…

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.…

跳出循环及数组部分方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 for循环forEach3、filtereverysome for循环 1、continue&#xff1b;跳出当次循环&#xff0c;进行下一个循环; function ceshi(){for(var i 0 ; i < 6 ; i){if…

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

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

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

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

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

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

页面配置、网络数据请求

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

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

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

凝聚层次聚类算法详解

一、引言 聚类分析是数据挖掘和机器学习领域中的一种重要技术&#xff0c;用于将相似的对象分组在一起。层次聚类是聚类分析中的一种方法&#xff0c;它通过对数据集进行层次分解来满足特定的条件。在层次聚类中&#xff0c;凝聚层次聚类是一种自底向上的策略&#xff0c;它首…

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

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

openGauss/MogDB调用C FUNCTION

openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现&#xff0c;通过 contrib 模块进行扩展的帖子&#xff0c;今天和恩墨工程师进行了一些交流&#xff0c;在 MogDB 中也可以实现同样的功能&#xff0c;原以为需要完整的 openGauss 的源码才能…

突破编程_C++_C++11新特性(function与bind绑定器)

1 可调用对象 C 中的可调用对象&#xff08;Callable Objects&#xff09;是指那些能够被调用执行的对象。这包括了函数、函数对象&#xff08;也叫做仿函数&#xff0c;即重载了 operator() 的类或者结构体&#xff09;、Lambda 表达式以及任何具有 operator() 的成员函数的对…

WPF Command

WPF COMMAND在Windows Presentation Foundation&#xff08;WPF&#xff09;框架中是一个设计模式&#xff0c;主要用于实现用户界面&#xff08;UI&#xff09;元素和业务逻辑之间的松耦合交互。具体来说&#xff0c;它是MVVM&#xff08;Model-View-ViewModel&#xff09;架构…

C语言经典面试题目(十一)

1、如何在C语言中进行动态内存分配的错误处理&#xff1f; 在C语言中进行动态内存分配时&#xff0c;需要注意处理内存分配失败的情况。常见的错误处理方式包括&#xff1a; 使用 malloc、calloc 或 realloc 函数进行内存分配后&#xff0c;检查返回的指针是否为 NULL&#x…

PyTorch学习笔记之基础函数篇(十一)

文章目录 7 元素级别的数学运算7.1 torch.abs() 函数7.2 torch.cos() 函数7.3 torch.acos() 函数7.4 torch.add()函数 7 元素级别的数学运算 7.1 torch.abs() 函数 在PyTorch中&#xff0c;torch.abs 函数用于计算张量中每个元素的绝对值。这个函数会返回一个新的张量&#x…

python爬虫实战——抖音

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

Java与Go:Map

Map&#xff08;也可以成为字典&#xff0c;映射表&#xff09;是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它是一种抽象的数据类型并且允许通过键来快速查找和访问与之相关联的值。在Java和Go中&#xff0c;Map提供了一种非常方便的方…

文章管理AI在架构设计中的关键作用

随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为各行业的创新引擎。在内容管理领域&#xff0c;文章管理AI的崛起不仅改变了传统的内容生产方式&#xff0c;更在架构设计层面展现出其独特的价值和潜力。本文旨在深入探讨文章管理AI在架构设计…