seata源码分析-TM-开启全局事务

seata源码分析-TM-开启全局事务

  • 导读
    • 源码分析
      • 1、初始化全局事务扫描器(GlobalTransactionScanner)
      • 2、初始化TM Client,RM Client
      • 3、生成代理类对象
      • 4、向TC发起开启全局事务

导读

seata源码分析-TM-开启全局事务_第1张图片

模块名称 模块描述
samples-business 分布式事务入口(TM)
samples-account 账户(RM)
samples-order 订单(RM)
samples-storage 库存(RM)

分布式调用场景:business下单----》storage扣减库存----》创建订单-----》扣减用户账户
分布式事务模式:AT

源码分析

Spring Boot环境下,TM开启全局事务的流程
1、初始化全局事务扫描器(GlobalTransactionScanner)
2、初始化TM Client,RM Client
3、生成代理类对象
4、向TC发起开启全局事务

1、初始化全局事务扫描器(GlobalTransactionScanner)

找到GlobalTransaction自动配置类
在这里插入图片描述
初始化扫描器类对象
seata源码分析-TM-开启全局事务_第2张图片
通过扫描器类发现继承,实现关系
在这里插入图片描述

2、初始化TM Client,RM Client

通过InitializingBean接口,实现afterPropertiesSet
初始化TM、RM客户端
seata源码分析-TM-开启全局事务_第3张图片
初始化TM、RM netty客户端
seata源码分析-TM-开启全局事务_第4张图片

registerSpringShutdownHook钩子函数,在Spring容器停止的时候关闭Netty连接

3、生成代理类对象

通过继承AbstractAutoProxyCreator
重写wrapIfNecessary方法
seata源码分析-TM-开启全局事务_第5张图片
创建一个GlobalTransactionalInterceptor组件,用于拦截标注了@GlobalTransactionl 方法的类
把标注了@GlobalTransactionl方法所在的类 变成一个代理对象

4、向TC发起开启全局事务

GlobalTransactionalInterceptor会拦截所有发起全局事务的方法
seata源码分析-TM-开启全局事务_第6张图片
1)判断被拦截的方法上是否标注了@GlobalTransactional
2)判断被拦截的方法上是否标注了@GlobalLock
3)调用handleGlobalTransaction()方法
seata源码分析-TM-开启全局事务_第7张图片
调用全局事务模版方法,传入匿名内部类
改内部类包括3个方法,分别是
1)执行真正业务逻辑的方法
2)获取全局事务名称的方法
3)获取添加方法上的全局事务注解属性对象描述信息
seata源码分析-TM-开启全局事务_第8张图片
1)创建或者生成一个新的全局事务
2)获取@GlobalTransacationl注解解析出来的对象的信息
3)开启全局事务
4)执行业务逻辑
5)执行业务逻辑没有抛出异常,全局提交;执行业务逻辑抛出异常,全局回滚

你可能感兴趣的:(微服务,java)