Spring篇(5-1)--Spring事务流程原理

本文深入剖析了Spring事务管理的核心机制,从@EnableTransactionManagement入手,详细解释了AutoProxyRegistrar和ProxyTransactionManagementConfiguration的作用,以及TransactionInterceptor如何实现事务控制。

前言:

我们知道,使用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 TransactionAttributeSource transactionAttributeSource(){
    return new AnnotationTransactionAttributeSource();
}

属性解析器是用来解析@Transaction注解

备注:属性解析器有⼀个成员变量是annotationParsers,是⼀个集合,可以添加多种注解解析器(TransactionAnnotationParser),对应@Transaction的注解属性

(2)事务拦截器:

@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionInterceptortransactionInterceptor(TransactionAttributeSource transactionAttributeSource){
    //1、创建TransactionInterceptor对象
    TransactionInterceptor interceptor = new TransactionInterceptor();
    //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{

    //If the transactionattribute is null,the method is non-transactional.
    //1.获取属性解析器,即在ProxyTransactionManagementConfiguration容器配置类中注册事务拦截器时注入的
    TransactionAttributeSource tas=getTransactionAttributeSource();
    final TransactionAttribute txAttr=(tas!=null? tas.getTransactionAttribute(method,targetClass):null);
    //2.获取事务管理器
    final TransactionManager tm=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(获取事务管理器,执行提交事务操作)

 更多内容:

Spring篇(1)--SpringBoot是什么?原理是怎么样的?

Spring篇(2)--Spring IOC基本流程原理

Spring篇(3)--Spring Aop基本流程原理

Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段

Spring篇(4-2)--Spring BeanFactory与FactoryBean 区别

Spring篇(5-1)--Spring事务流程原理

Spring篇(5-2)--Spring事务传播行为

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun cat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值