Seata事务客户端执行流程分析
带着问题了解Seata原理
1、Spring事务类型有哪几种?
1、在Spring启动过程中是如何将事务方法织入到Aop拦截器中的?
2、SpringBoot的Seata事务是如何传递的?
3、SpringCloud如何实现Seata客户端事务传递?
4、Seata事务传递如何保证线程安全?
5、Seata的执行入口是什么?
6、Seata的是如何实现数据源代理的?
7、A服务->B服务,A服务->C服务,C出错,B服务时如何回滚的?
8、如果在提交事务阶段时,网络抖动如何保证数据一致性?
9、Seata的TM、RM、TC如何通信?
GlobalTransactionScanner 事务扫描器
一、事务扫描器设计图
二、组件说明
GlobalTransactionScanner扫描器继承及实现了SpringBoot的组件
继承组件:
AbstractAutoProxyCreator
实现组件:
DisposableBean,ApplicationContextAware,InitializingBean
1.AbstractAutoProxyCreator
创建动态代理对象
2.DisposableBean:
在Bean生命周期结束前调用destory()方法做一些收尾工作,亦可以使用destory-method。
3.InitializingBean:
接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的子类,在初始化bean的时候会执行该方法。
4.ApplicationContextAware
Spring的IOC容器
三、流程分析
1.ApplicationContextAware
2.AbstractAutoProxyCreator
重写wrapIfNecessary
1.设置事务类型拦截器
2.判断方法是否有事务或者锁注解
3.设置Bean的代理信息
3.InitializingBean
通过实现InitializingBean有了afterPropertiesSet初始化方法
初始化连接RM,TM
4.DisposableBean
GlobalTransactionalInterceptor 事务拦截器
一、事务拦截器设计图
二、组件说明
GlobalTransactionalInterceptor 扫描器实现了SpringBoot的组件
实现组件:
MethodInterceptor
1、MethodInterceptor 方法拦截器
在spring boot下有两种方式设置AOP(实现织入weave):
- 使用@Aspect注解
- 使用DefaultPointcutAdvisor
三、流程分析
1、MethodInterceptor
当方法上含有GlobalTransactional或者GlobalLock注解时会被注入到Aop拦截代理中,当执行方法前会调用GlobalTransactionalInterceptor中MethodInterceptor的invoke实现
2.封装事务执行器
3.transactionalTemplate执行excute方法内容
4.事务类型
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
事务传播模式方式1
事务传播模式方式2
分布式事务开始以及业务代码执行和回滚
1、向Tm发送事务信息
2、执行业务代码
3、业务出错通知tm,tm通知所有tc回滚
4、业务执行成功通知tm执行完成,tm通知其他tc提交事务