Spring事务流程原理

前言:

我们知道,使用Spring事务只需要几个注解即可@EnableTransactionManagement @Transactional,那它是怎么做到的呢?

 

一、@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(获取事务管理器,执行提交事务操作)

 

 

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页