Spring声明式事务执行流程

在Spring声明式事务底层源码分析中我们对其重要的类及方法结合AOP进行了分析,发现和我们的AOP调用流程十分的相似。在对事务管理的源码分析主要从配置类中开启事务管理的注解EnableTransactionManagement进行了分析,从其注解引入注册的类引出我们对源码的理解。
为了大家更加清楚的理解源码,以及其事务的执行流程,我们以上次博客的代码,进行debug调用,再次来学习下Spring声明式事务的执行流程及其源码,具体详细有兴趣可查看Spring声明式事务底层源码分析。

首先在测试类中,就开启了事务管理的addUser方法打上断点,跟进
在这里插入图片描述
进入后,发现其实和AOP一样,进入了其增强的方法
Spring声明式事务执行流程_第1张图片
在其增强方法中,发现也是获取其拦截链,拦截链是什么呢?就是我们之前分析的实现了MethodInterceptor接口的TransactionInterceptor类(父类为TransactionAspectSupport)。继续向下看
Spring声明式事务执行流程_第2张图片
发现和我们的AOP一样,也是调用proceed()方法,我们继续跟进
Spring声明式事务执行流程_第3张图片
发现是我们AOP一模一样,也是同一个类同一个方法,也是要通过if判断执行完所有的拦截方法,在进入方法体内,先向下看
在这里插入图片描述
拿到第一个拦截类(其实总共就一个),调用invoke方法
Spring声明式事务执行流程_第4张图片
发现就是调用我们的TransactionInterceptor类中的方法,和我们的AOP调用对应注解如@Before、@After对应的处理类的方法,其实是一样的流程,继续跟进
Spring声明式事务执行流程_第5张图片
其实就是调用了其父类的方法,然后把属性加进来,把事务管理器加进来等,继续向下看
Spring声明式事务执行流程_第6张图片
然后就会调用我们的目标方法,我们查看一下调用我们目标方法的过程
在这里插入图片描述
回到了上图处,因为和AOP一样,从该类调用invoke方法是,我们是把该类(this)当成参数传递过去的,继续
Spring声明式事务执行流程_第7张图片
继续跟进
Spring声明式事务执行流程_第8张图片
然后就会发现开始执行我们的目标方法了
Spring声明式事务执行流程_第9张图片
执行到 4 / 0 肯定就会抛出异常啦
Spring声明式事务执行流程_第10张图片
然后就会被我们的catch捕获到,如下
Spring声明式事务执行流程_第11张图片
抛出异常了,我们肯定要进行回滚,进入跟进查看
在这里插入图片描述
回滚后,并把异常抛出
Spring声明式事务执行流程_第12张图片
我们现在就该清楚当我们声明了事务,执行过程中发生异常是如何进行回滚的,那要是执行正常呢,我们在试一次,我们将异常行注释掉

    @Transactional
    public void addUser(){
        userDao.insert();
        //int i = 4 / 0;
    }

因为之前的步骤都是一致的,我们直接从下图处开始
Spring声明式事务执行流程_第13张图片
直接下一步,看看会执行到那一步
Spring声明式事务执行流程_第14张图片
这里没有发现异常直接跳过了catch内容,继续查看
Spring声明式事务执行流程_第15张图片
成功过直接提交
在这里插入图片描述

你可能感兴趣的:(Spring)