Spring事物的传播

spring的事物对于同一个类内部调用是不会生效的。

比如一个ServiceA,里面有个方法x()和y()。其中x没有配置事物,而y配置的有实物。如果是一个没有事物的ServiceB调用了ServiceA的x方法,而在x里面直接通过this.y()的方式调用y方法。那么y是不会有实物的,就算配置成PROPAGATION_REQUIRED 也是不会有事物的。

反之,如果是没有事物的ServiceB先调用的ServiceA的y,而y又内部调用x这时候是有事物的。

原理很简单,只有被spring托管的调用方式它才能在外层封装事物。

execution(* com.aaa.someDao.*(..))  第一个* 号表示任意返回值,后面的*(..)表示任意参数

PROPAGATION_REQUIRED  如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS  支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY  使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW  新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED  以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER  以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED  如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

 

我们系统启动事物的方式是:先通过AspectJExpressionPointcutAdvisor拦截,然后txadviser用org.springframework.transaction.interceptor.TransactionInterceptor来管理事物。

 

 

 

 


posted @ 2019-11-26 14:46  DevLogic  阅读(151)  评论(0编辑  收藏  举报