分布式事务Seata-AT模式

news/2024/11/26 4:30:39/

承接上文分布式事务-二阶段提交

Seata是开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务,包含AT、TCC、 SAGA、XA四种事务模式,为用户打造一站式的分布式解决方案。

Seata提供的4种事务模式都是由2PC(二阶段提交)转换过来的。

在介绍该流程之前,先了解下3个Seata角色,

  • TC 事务协调者
    TC是Seata服务端,维护全局和分支事务的状态,驱动全局事务提交或回滚。
  • TM 事务管理者
    定义全局事务的范围,开始全局事务,提交或回滚全局事务。
  • RM 资源管理器
    事务参与者,管理分支事务,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

在事务开始之前,TM和所有的RM都需要先注册到TC。

注册以后,用户发起请求到TM(business),TM开启全局事务和进行远程调用库存(库存减1)和订单服务(加1),再由订单远程调用用户服务(加积分)。

TM是整个事务的入口,全局事务或分布式事务的开启者。

TC就是Seata Server,TC是统筹者,所有的分支事务都需要注册到TC上。

注册之后,由事务发起者来发送对应的请求,告诉每个执行者开始执行业务,无论成功或失败,都会发送消息通知TC,最后由TC告诉所有RM是提交还是回滚。

Seata配置Nacos作为注册中心和配置中心

Seata集群存储事务的数据,通过db数据库的方式存储数据。

Nacos可以完成对Seata集群的负载均衡。

用Seata管理分布式事务,通过TC来统筹RM,事务的参与者RM是Seata的客户端,TC是Server端,Server和Client端要注册到同一个namespace中。

Seata AT模式是二阶段提交模式的演变,是无侵入的分布式事务解决方案,在AT模式下,一阶段用户只需要关注自己的业务sql,Seata框架会自动生成事务的第二阶段进行提交或回滚操作。

  • 一阶段:业务数据和回滚的日志记录在同一个本地事务中提交,然后释放本地锁和连接资源。
  • 二阶段:提交或回滚(回滚通过一阶段的回滚日志进行反向补偿)。

一阶段,会拦截业务sql(比如订单先调用库存(库存减1),再生成订单),Seata解析sql语句,同时要找到当前要更新的业务数据,比如库存减1,在数据被更新前,保存undolog日志,再执行业务sql,更新之后的数据再保存到redolog日志。

如果一阶段某个服务的本地事务没有通过,就全局回滚,让当前所有数据回滚到开始之前的状态,否则就提交全局事务。

回滚的时候所用到的数据就在undolog,即在数据被正式更新之前所保存下来的原数据作为回滚的依据,通过回滚反向生成sql完成分支事务的回滚,事务结束后会释放所有资源和删除所有日志。

AT模式详细分解

订单服务执行本地事务订单+1,库存服务执行本地事务库存减1。

TM发起全局事务的执行,不同的分支事务需要执行自己的本地事务。

订单服务既是RM又是TM,在订单开启全局事务,远程调用库存服务,又要执行本地事务订单+1。

Order告诉TC我要开始执行分支事务了,Stock也要开始执行分支事务,两个RM开始执行自己的分支事务。

Order注册分支事务,记录undolog,即在真正执行分支事务(本地事务)数据更改之前的数据要记录在undolog中,更改之后的数据要记录在redolog中。

Order开启远程调用Stock,Stock也一样开始注册自己的本地事务,记录更改之前的数据到undolog,记录更改之后的数据到redolog。

2个分支事务执行完之后,需要告诉TC当前这2个事务的执行状态,TC如果收到了2个RM都执行成功的消息,第二阶段就做全局的提交,否则全局回滚。


http://www.ppmy.cn/news/49779.html

相关文章

ts学习笔记(一)

ts定义:融合了后端面向对象思想的超级版的javascript语言。 环境搭建: 1.npm init -y 2.npm i typescript -D 3.tsc --init 初始化tsconfig.json配置文件 ts的优势 : 1.编译时静态类型检测 2.自动提示更清晰明确 3.引入了泛型和一系列的ts特…

为什么大量失业集中爆发在2023年?被裁?别怕!失业是跨越职场瓶颈的关键一步!对于牛逼的人,这是白捡N+1!...

被裁究竟是因为自身能力不行,还是因为大环境不行? 一位网友说: 被裁后找不到工作,本质上还是因为原来的能力就配不上薪资。如果确实有技术在身,根本不怕被裁,相当于白送n1! 有人赞同楼主的观点&…

Step Port U-Boot(AM64x)

U-Boot移植 重要文件: xxx_defconfig:一般由平台厂商提供,提供了基础的默认配置,从而可以尽可能少改动源代码。Kconfig:是Kconfig系统的菜单项,当使用 make menuconfig时,Kconfig系统读取该文件&#xff…

shell脚本基础之详解脚本的控制

详解脚本的控制 信号的处理Linux信号生成信号中断进程暂停进程 捕获信号捕获脚本退出修改或移除捕获 以后台模式运行脚本后台运行脚本运行多个后台脚本 在非控制台下运行脚本作业控制 查看作业重启停止的作业调整谦让度nice命令renice命令 定时运行作业用 at 命令来定时执行作业…

蓝桥杯2023年第十四届省赛真题python A组 (个人的做题记录,没有全对,可以通过部分测试点)

试题 A: 特殊日期 本题总分:5 分 【问题描述】 记一个日期为 yy 年 mm 月 dd 日,统计从 2000 年 1 月 1 日到 2000000 年 1 月 1 日,有多少个日期满足年份 yy 是月份 mm 的倍数,同时也是 dd 的倍数。 【答案提交】 这是一道结果…

samba共享-(2)-Ubuntu(VMware)-win10(host)

硬件环境:win10(host) Ubuntu(VMware) 创建共享文件夹:1.安装samba。 2.修改配置文件,重启服务。 3.常用命令 ufwdpkg 4.常见问题 1.安装samba #1.查看并删除sambasamba -vdkpg -qa|grep sambadkpg -qa|grep samba|xargs rpm -e --nodep…

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目,从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统,探索了一套适用于地下污水厂的智能照明控制策略,以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…

如何使用 Linux find 命令查找文件?

在Linux系统中,find命令是一个非常强大的工具,可以帮助用户查找文件或目录。这篇教程将向您展示如何使用Linux find命令来查找您需要的文件。 基本语法 在使用Linux find命令之前,您需要了解其基本语法。Linux find命令的基本语法如下&…