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来管理事物。