SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先,如果在某个类或某个方法被标记为@Transactional时,Spring boot底层会在创建这个bean时生成代理对象(默认使用cglib)
示例:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第1张图片
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第2张图片
当调用studentService的addStudent方法时,会直接跳到CglibAopProxy类去执行intercept方法(因为studentService是使用cglib生成的代理对象)
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第3张图片
当执行

List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
 
  

到这句时,chain里就是Spring Boot在生成代理对象时配置的Advisor,实际就是一个TransactionInterceptor.接着往下执行,到

retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

将进入CglibAopProxy类,如下图proceed方法
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第4张图片
它将调用父类ReflectiveMethodInvocation的proceed方法,
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第5张图片
执行到最下边return那行时,会进入TransactionInterceptor的invoke方法,代码如下:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第6张图片
可以看到调用了invokeWithinTransaction方法,代码如下图所示
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第7张图片
invocationTransaction代码如下:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第8张图片
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第9张图片
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第10张图片
其中createTransactionIfNecessary用来开启事务,commitTransactionAfterReturning用来提交事务,
retVal = invocation.proceedWithinTransaction用来执行业务代码
执行invocation.proceedWithinTransaction会回到TransactionInterceptor类:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第11张图片
执行invocation.proceed,回到CgligApoProxy类:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第12张图片
调用super.proceed回到父类ReflectiveInvocationMethodInvocation,
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第13张图片
如上图,这次将执行invokeJoinpoint方法,也就是我们自己定义的业务方法,invokeJoinpoint代码如下:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第14张图片
从上图可以看到,通过反射的方式调用了我们自己定义的业务方法,然后返回到ReflectiveMethodInvocation类:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第15张图片
继续返回到CglibAopProxy类:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第16张图片
继续返回TransactionInterceptor类的invoke方法:
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第17张图片
继续返回,
SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程_第18张图片
retVal拿到了业务方法调用的结果,然后调用commitTransactionAfterReturning,将事务提交,整个流程结束

你可能感兴趣的:(SpringBoot,spring,boot,数据库,后端)