Spring事务增强简析

为详述sping通过AOP框架实现对目标方法的事务增强,现举例如下:

源代码状态下:

logicA(){

       doSomething1();

       logicB();

       doSomething4();

}

logicB(){

       doSomething2();

       doSomething3();

}

// 测试类

Class Test(){

       logicA();

}

 

Spring事务管理状态:

Class Test(){

       T1 begin

       logicA(){

         doSomething1();

         T2 begin     

         logicB(){

           doSomething2();

           doSomething3();

    }

       T2 end

       doSomething4();

  }

       T1 end

}

上述所体现出来的事务T1开始、结束,T2开始、结束,都可以理解为spring事务控制下的代码增强,这个逻辑是由代理方法实现,来源于spring-tx包下的事务切面类,如下图所示:

 

TransactionAttribute:获取目标方法的事务配置信息,即事务定义信息,logicA、logicB将分别对应一个。

PlatformTransactionManager:事务管理器,其内定义了事务状态获取方法、提交事务方法方法、回滚事务方法,logicA、logicB对应同一个事务管理器。

JoinPointIndentification:切入点基本信息,debug模式下即可以通过此参数确定当前事务对应的切入点为何。

TransactionInfo txInfo = createTransactionIfNecessary(tm,txAttr,joinPointIndentification);

此方法即为构建事务对象,经代码debug验证,测试代码经由logicA调入logicB方法时,将分别对应各自的TransactionInfo。

上面截图中的这段代码即为spring事务控制对目标方法增强的直接体现:

Try{

       retVal = invocation.proceed();

}catch(Throwable ex){

       completeTransactionAfterThrowing(txInfo,ex);

       throw ex;

}

Finally{

       cleanupTransactionInfo(txInfo);

}

commitTransactionInfo(txInfo);

return retVal;

spring通过事务拦截器,将目标方法放入了一个try catch中,通过捕获异常的方法,进行基础的事务回滚操作,因此也就决定了一个大前提,目标方法内部报错不可怕,需严格throw出来才有可能被事务拦截器捕获,进行后续操作,如若内吞了,不抛错了,将直接指向正常提交事务方法中,因为目标方法外未捕获到异常。

 

posted @ 2020-04-07 17:27  adong  阅读(353)  评论(0)    收藏  举报