基于AOP,Spring有一个针对@Transactional注解的增强器(拦截器)TransactionInterceptor,在Bean实例初始化的最后一步对事务方法进行增强 :::info TransactionInterceptor ::: 在调用被@Transactional 注解的public方法的时候,实际调用的是代理类TransactionInterceptor中的invoke()方法。
    TransactionInterceptorinvoke源码如下

    1. //TransactionInterceptor和别的拦截器一样,他也有invoke方法
    2. public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
    3. ............
    4. @Override
    5. public Object invoke(final MethodInvocation invocation) throws Throwable {
    6. Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
    7. // Adapt to TransactionAspectSupport's invokeWithinTransaction...
    8. return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {
    9. @Override
    10. public Object proceedWithInvocation() throws Throwable {
    11. return invocation.proceed();
    12. }
    13. });
    14. }
    15. ..........
    16. }

    :::info invokeWithinTransaction ::: 跟一下invokeWithinTransaction 函数,省去不必要的代码,这里可以清晰的看到,该拦截器实现事务的方式和我们在DAO层手动实现事务差不多:

    • 在目标方法之前开启事务
    • 数据库方法调用,只不过这里把执行的逻辑换成了递归执行拦截链了
    • 方法调用完成之后提交事务
    • 方法执行过程中如果遇到异常的时候回滚事务。
      1. protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
      2. throws Throwable {
      3. .............
      4. if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
      5. // 开启事务
      6. TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
      7. Object retVal = null;
      8. try {
      9. //递归执行拦截链
      10. retVal = invocation.proceedWithInvocation();
      11. }
      12. catch (Throwable ex) {
      13. // 出现异常,回滚事务
      14. completeTransactionAfterThrowing(txInfo, ex);
      15. throw ex;
      16. }
      17. finally {
      18. cleanupTransactionInfo(txInfo);
      19. }
      20. //提交事务
      21. commitTransactionAfterReturning(txInfo);
      22. return retVal;
      23. }
      24. .................
      25. }
      到这就可以清晰地了解,Spring的事务实现就是一个Spring自带的拦截器TransactionInterceptor 加入到拦截链中,该拦截器负责增强实现事务。