Seata运行流程分析|学习笔记

简介: 快速学习Seata运行流程分析

开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段Seata运行流程分析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/687/detail/11931


Seata运行流程分析


内容介绍

一 Seata 运行流程图分析

二 Seata 运行流程重要知识点说明


一Seata运行流程图分析

(1)流程图各类含义

第一类 TM 位于订单微服务上负责全局事物的 bank 和 Global,第二个和第三个均属于一类为 RM,分别为订单微服务和商品微服务,第三类 TC 事务协调者称为 SeataServer。

image.png

(2)实际工作情况分析

首先,在订单微服务的请求上面的@GLobalTransactional//全局事务控制是开启全局事物的标识,

当请求进入到这个方法时,在订单微服务上 TM 向TC注册开启全局事务,TC 向 TM 返回 XID,XID 为下单全局事务的标识符,

代码继续向下运行过程中,订单微服务的 RM 向 TC 注册一个分支事务 BranchidID,这个分支事务位于 XID 的管辖之下.BranchID 返回后可标识订单微服务的分支。

然后下单操作

//2下单(创建订单)

Order order =new order();

Order.setuid(1);

Order.setusername(“测试用户”);

Order.setpid(pid);

Order.setpname(product.getPname());

Order.setpprice(Prpduct.getppgrice());

Order.stenumber(1);

Orderdao.save(order)

Log.info(‘’创立订单成功,订单信息)

下单完成后向 Undo.log 日记记录保留向数据库写库前和写库后状态的变化的信息,目的如果出项问题,

反馈时从 Orderdao.save(order)逆向操作。完成后提交本地分支事务。

操作完毕后上报分支事务处理结果 TC

接下来进行远程调用减库存的服务,

调用 productservice.reduceinventory(PID,orde)

代码来到

//查询

Product product=productdao. Findbyid(p

//省略校验

//内存中扣减

Product.setSetstock(product.getstock()-R

//模拟异常

//int i=1/0

然后,商品微服务 RM 向 TC 申请注册分支事务,返回 BranchidID 与之前 BranchidID 不一样,但均属于 XID 之下

代码运行

//查询

Product product=productdao. Findbyid(p

//省略校验

//内存中扣减

Product.setSetstock(product.getstock()-R

//模拟异常

//int i=1/0

进行减存服务 undo.Log 日志记录提交本地分支事务,完成后上报分支事务处理结果

然后TM发起全局事务决议,观察2个事务是否成功

若成功后由 Tm 发起全局事务的提交,再由 TC 返回 RM 删除 Undo.log 日记

若出现问题 TM 向 TC 回滚,Tc则通知各RM进行回滚,完成后,删除 Undo.log 日记

回滚:按照 Undo.log 日记记录信息进行逆向操作


二Seata运行流程重要知识点说明

  1. 每一个 RM 使用 DataSourrceProxy 连接数据库,其目的是使用 DataSourrceProxy 使用数据源和数据连接代理的目的就是在第一阶段将 Undo.log 和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有Undo.log
  2. 在第一阶段 Undo.log 中存放了数据修改前和修改后的值,为事务回滚做好准备,所以在第一阶段完成就已经将分支事务提交,也就解放了锁资源
  3. TM开启全局事务开始,将 XID 全局事务 id 放在事务上下文中,通过 feign 调用也将 XID 传入下游分支事务,每个分支事务将自己的 BranchidID 分支事务 ID 和 XID 关联。

关联之后的模型如下:

image.jpeg

4.第二阶段全局事务提交,TC 会通知各个分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各个参与者只需要删除 Undo.log 即可,并且可以异步执行,第二阶段很快完成.

5.第二阶段全局事务回滚,TC 会通知各个分支参与者回滚分支事务,通过 XID和BranchidID 找到相应的回滚日志,通过回滚日志生成反向 sql 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。

相关文章
|
4月前
|
Nacos 数据库 Docker
nacos常见问题之docker部署的seata,成功注册到nacos运行报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
566 2
|
4月前
|
Java 关系型数据库 数据库
Seata常见问题之docker运行报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
502 0
|
4月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
649 0
|
4月前
|
SQL SpringCloudAlibaba 中间件
SpringCloud Alibaba Seata处理分布式事务--学习笔记
SpringCloud Alibaba Seata处理分布式事务--学习笔记
63 0
Seata的AT模式执行流程
Seata的AT模式执行流程
|
Java 中间件 Unix
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
146 0
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
|
SQL 存储 Java
猿创征文|手把手教你微服务分布式事务与Seata框架源码分析(二)
猿创征文|手把手教你微服务分布式事务与Seata框架源码分析
201 0
 猿创征文|手把手教你微服务分布式事务与Seata框架源码分析(二)
|
Java 数据库 微服务
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成
|
Oracle 中间件 关系型数据库
【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)
【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)
993 0
【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)
|
SQL Java 关系型数据库
猿创征文|手把手教你微服务分布式事务与Seata框架源码分析(一)
猿创征文|手把手教你微服务分布式事务与Seata框架源码分析
178 0
猿创征文|手把手教你微服务分布式事务与Seata框架源码分析(一)