欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务(二)-----实现原理aop

程序员文章站 2022-05-09 15:59:33
...

Spring实现事务的方式分为编程式和声明式,其中声明式是最为常见的,声明式事务的实现又分为XML配置文件、@Transactional注解两种实现方式,SpringBoot因为取消了XML配置文件的书写,所以SpringBoot中的事务主要是使用@Transactional注解来实现的,下面从源码角度分析其原理

已知@Transactional事务实现的原理是基于AOP来实现的,在之前的博客中详细讲解了AOP的实现原理:动态代理+拦截链,由此可以大概推测出@Transactional的实现逻辑:Spring有一个针对@Transactional的增强器(拦截器)Interceptor,在bean实例初始化的最后一步会调用带该拦截器的拦截器链增强@Transactional注解的方法,并且生成代理类
事务(二)-----实现原理aop

TransactionInterceptor拦截器
关于拦截器链如何形成并且执行的,这里不做赘述,这里主要关注针对@Transactional注解的拦截器

TransactionInterceptor,和别的拦截器一样,他也有invoke方法

public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
............
   @Override
   public Object invoke(final MethodInvocation invocation) throws Throwable {
      Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);

      // Adapt to TransactionAspectSupport's invokeWithinTransaction...
      return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {
         @Override
         public Object proceedWithInvocation() throws Throwable {
            return invocation.proceed();
         }
      });
   }
..........
}

跟一下invokeWithinTransaction 函数,省去不必要的代码,这里可以清晰的看到,该拦截器实现事务的方式和我们在DAO层手动实现事务差不多,都是先开启事务,再执行,如果异常则回滚,否则提交事务,只不过这里把执行的逻辑换成了递归执行拦截链了

protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
      throws Throwable {
  .............
   if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
      // 开启事务
      TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
      Object retVal = null;
      try {
         //递归执行拦截链
         retVal = invocation.proceedWithInvocation();
      }
      catch (Throwable ex) {
         // 出现异常,回滚事务
         completeTransactionAfterThrowing(txInfo, ex);
         throw ex;
      }
      finally {
         cleanupTransactionInfo(txInfo);
      }
      //提交事务
      commitTransactionAfterReturning(txInfo);
      return retVal;
   }
.................
}

到这就可以清晰地了解,Spring的事务实现就是一个Spring自带的拦截器加入到拦截链中,该拦截器负责增强实现事务。

相关标签: 事务