在同一个类里面spring的传播机制是不起作用的比如说在执行saveA方法的时候调用C方法插入C设置的传播属性是不使用事物
但是执行的效果是saveA方法抛出异常后导致C的记录回滚了也就是说明C方法设置的隔离级别不起作用。
@Transactional
public void saveA() throws Exception{
C();
throw new RuntimeException();
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void C() throws Exception {
mapper.insertEntity(entity);
}
接下来新创建一个serviceB类
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void B() throws Exception {
mapper.insertEntity(entity);
}
@Transactional
public void saveA() throws Exception{
serviceB.B();
throw new RuntimeException();
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void C() throws Exception {
mapper.insertEntity(entity);
}
此时在调用saveA方法B的记录就没有回滚了 也就是说spring的传播机制是针对于类的 然后同一个类方法相互调用隔离级别是不起作用的。
这个方法是通过spring的AOP类CglibAopProxy的内部类DynamicAdvisedInterceptor调用的,而DynamicAdvisedInterceptor继承了MethodInterceptor,用于拦截方法调用,并从中获取调用链。
如果是在同一个类中的方法调用,则不会被方法拦截器拦截到,因此事务不会起作用,必须将方法放入另一个类,并且该类通过spring注入