spring传播属性测试,从表象上理解spring的事务传播属性
如果是aop的方式调用
((TestService) AopContext.currentProxy()).doSomething();表示调用的是当前的代理对象,调用代理对象的方法时,就会重新走动态代理逻辑,如果使用this对象进行调用的话,就会将当前方法作为一个普通方法;不用重新走代理
1.当外层方法为非事务方法<\br>
在内层的方法如果this调用,都不会有事务的产生,
如果为aop的调用,则可能会在内层方法产生一个事务
2.当外层方法为required时。
- 如果内层方法为this调用,无论谁抛出异常 都会回滚
- 如果内层为aop调用,则受事务传播属性的影响
//每次都重新开启一个新的事务
// @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
// 如果当前存在事务,则加入当前事务中,如果当前不存在事务,则创建一个新的事务
// @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
//支持当前事务,如果当前不存在事务,则会抛出一个异常
// @Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY)
//以非事务的方式运行,如果当前存在事务,则抛出一个异常,会导致两个方法都回滚
// @Transactional(rollbackFor = Exception.class,propagation = Propagation.NEVER)
//嵌套事务,感觉跟requires_new类似
// @Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED)
/**
* 以非事务方式执行,如果存在当前事务,则挂起当前事务,
* 1.如果当前方法在写之后抛出异常,则当前方法写成功,外层方法带有事务调用回滚
* 1.如果当前方法在写之前抛出异常,则当前方法写回滚,外层方法带有事务调用回滚
*/
@Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)
// @Transactional(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS) //支持当前事务,如果不存在则以非事务方式执行。