Spring事务流程原理

举报
盼盼 发表于 2021/04/19 09:17:46 2021/04/19
【摘要】 一、@EnableTransactionManagement其实主要的方法在@EnableTransactionManagement 注解中,我们先来看看其源码    @Target(ElementType.TYPE)    @Retention(RetentionPolicy.RUNTIME)    @Documented    @Import(TransactionManagementC...

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

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。