开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段:Seata运行流程分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/687/detail/11931
Seata运行流程分析
内容介绍
一 Seata 运行流程图分析
二 Seata 运行流程重要知识点说明
一Seata运行流程图分析
(1)流程图各类含义
第一类 TM 位于订单微服务上负责全局事物的 bank 和 Global,第二个和第三个均属于一类为 RM,分别为订单微服务和商品微服务,第三类 TC 事务协调者称为 SeataServer。
(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运行流程重要知识点说明
- 每一个 RM 使用 DataSourrceProxy 连接数据库,其目的是使用 DataSourrceProxy 使用数据源和数据连接代理的目的就是在第一阶段将 Undo.log 和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有Undo.log
- 在第一阶段 Undo.log 中存放了数据修改前和修改后的值,为事务回滚做好准备,所以在第一阶段完成就已经将分支事务提交,也就解放了锁资源
- TM开启全局事务开始,将 XID 全局事务 id 放在事务上下文中,通过 feign 调用也将 XID 传入下游分支事务,每个分支事务将自己的 BranchidID 分支事务 ID 和 XID 关联。
关联之后的模型如下:
4.第二阶段全局事务提交,TC 会通知各个分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各个参与者只需要删除 Undo.log 即可,并且可以异步执行,第二阶段很快完成.
5.第二阶段全局事务回滚,TC 会通知各个分支参与者回滚分支事务,通过 XID和BranchidID 找到相应的回滚日志,通过回滚日志生成反向 sql 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。