Spring事务流程原理
一、@EnableTransactionManagement
其实主要的方法在@EnableTransactionManagement 注解中,我们先来看看其源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public@interfaceEnableTransactionManagement{
@EnableTransactionManagement 注解使⽤ @Import 标签引⼊了TransactionManagementConfigurationSelector类,这个类⼜向容器中导⼊了两个重要的组件
我们可以看一下其主要流程:
二、AutoProxyRegistrar注册一个后置处理器组件
AutoProxyRegistrar.registerBeanDefinitions()->AopConfigUtils.registerAutoProxyCreatorIfNecessary
最终发现,注册了⼀个叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,⽽这个类是AbstractAutoProxyCreator 的⼦类,实现了 SmartInstantiationAwareBeanPostProcessor 接⼝。
它实现了SmartInstantiationAwareBeanPostProcessor,说明这是⼀个后置处理器,⽽且跟spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实现的是同⼀个接⼝,所以说,声明式事务是 springAOP 的⼀种应⽤。
三、ProxyTransactionManagementConfiguration 事务管理组件
ProxyTransactionManagementConfiguration是⼀个容器配置类,注册了⼀个事务增强器组件,然后在这个事务增强器中⼜注⼊了两个属性:属性解析器(transactionAttributeSource)、事务拦截器(transactionAttributeSource)
可以看到分别想事务增强器中注入两个比较重要的组件,分别是属性解析器以及事务拦截器
(1)属性解析器
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionAttributeSourcetransactionAttributeSource(){
return new AnnotationTransactionAttributeSource();
}
属性解析器是用来解析@Transaction注解
备注:属性解析器有⼀个成员变量是annotationParsers,是⼀个集合,可以添加多种注解解析器(TransactionAnnotationParser),对应@Transaction的注解属性
(2)事务拦截器:
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionInterceptortransactionInterceptor(TransactionAttributeSourcetransactionAttributeSource){
//1、创建TransactionInterceptor对象
TransactionInterceptorinterceptor=new();
//2、传入属性解析器
interceptor.setTransactionAttributeSource(transactionAttributeSource);
if(this.txManager!=null){
//3、传入事务管理器
interceptor.setTransactionManager(this.txManager);
}
return interceptor;
}
1.可以看到事务拦截器在做初始化操作
A、创建TransactionInterceptor对象
B、传入属性解析器
C、传入事务管理器
2.同时我们可以观察到TransactionInterceptor对象实现了MethodInterceptor接⼝
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor,Serializable{
追溯⼀下上⾯提到的InfrastructureAdvisorAutoProxyCreator后置处理器,它会在代理对象执⾏⽬标⽅法的时候获取其拦截器链,⽽拦截器链就是这个TransactionInterceptor,这就把这两个组件联系起来
3.接着我们看一下拦截器中的invoke()方法
@Nullable
protected Object invokeWithinTransaction(Methodmethod,@NullableClass<?> targetClass,
final InvocationCallbackinvocation) throwsThrowable{
//Ifthetransactionattributeisnull,themethodisnon-transactional.
//1.获取属性解析器,即在ProxyTransactionManagementConfiguration容器配置类中注册事务拦截器时注入的
TransactionAttributeSourcetas=getTransactionAttributeSource();
final TransactionAttributetxAttr=(tas!=null? tas.getTransactionAttribute(method,targetClass):null);
//2.获取事务管理器
final TransactionManagertm=determineTransactionManager(txAttr);
......
Object retVal;
try{
retVal=invocation.proceedWithInvocation();
}
catch(Throwableex){
//targetinvocationexception
//3-1.如果目标方法抛异常,会执行completeTransactionAfterThrowing(获取事务管理器,执行回滚操作)
completeTransactionAfterThrowing(txInfo,ex);
throwex;
}
finally{
cleanupTransactionInfo(txInfo);
}
......
//3-2.如果目标方法正常执行,则会执行commitTransactionAfterReturning(获取事务管理器,执行提交事务操作)
commitTransactionAfterReturning(txInfo);
return retVal;
可以看到源代码中会有以下操作
1.获取属性解析器,即在ProxyTransactionManagementConfiguration容器配置类中注册事务拦截器时注入的
2.获取事务管理器
3-1.如果目标方法抛异常,会执行completeTransactionAfterThrowing(获取事务管理器,执行回滚操作)
3-2.如果目标方法正常执行,则会执行commitTransactionAfterReturning(获取事务管理器,执行提交事务操作)
- 点赞
- 收藏
- 关注作者
评论(0)