请先看如下代码:
@Transactional
public CommonReturnType funA() {
//...
funB(); // 调用函数B
//...
func(); // 调用函数C
//...
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void funB() {
//...
}
@Transactional(propagation = Propagation.REQUIRES)
public void funC() {
//...
}
关于注解的有关解释
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时,
- 内层Service的方法被调用时,外层方法的事务被挂起;
- 内层事务相对于外层事务是完全独立的,有独立的隔离性;
- 新的执行完毕,继续执行老的事务
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES”时,
- 如果有事务,那么加入事务,没有的话新建一个
当出现异常时:
- 1、当方法B或者C报错时,A、B、C方法都回滚
- 2、当方法A、B、C异常被捕获时,A、B、C事务不回滚(a、b、c均入库)
- 3、当方法BC执行后,方法A报错时,A、C事务回滚,B事务不回滚(b数据入库)
References
[1] (转)添加PROPAGATION_REQUIRES_NEW 事务没有产生作用
[2] 常用事务@Transactional(propagation=Propagation.REQUIRES_NEW)和@Transactional(propagation=Propagation.REQU