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出来才有可能被事务拦截器捕获,进行后续操作,如若内吞了,不抛错了,将直接指向正常提交事务方法中,因为目标方法外未捕获到异常。

浙公网安备 33010602011771号