方法 A 中调用 B 后再调用 C, 三个方法中均有插入数据后再查询数据
B 方法的注解:@Transactional (propagation=Propagation.REQUIRES_NEW) -- 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
C 方法的注解:@Transactional (propagation=Propagation.REQUIRED) -- 如果有事务,那么加入事务,没有的话新建一个
1、当方法 B 或者 C 报错时,A、B、C 方法都回滚
2、当方法 A、B、C 异常被捕获时,A、B、C 事务不回滚(a、b、c 均入库)
3、当方法 BC 执行后,方法 A 报错时,A、C 事务回滚,B 事务不回滚(b 数据入库)
A 方法向表中添加数据 a,在查询该表能得到数据 a
B 方法向表中添加数据 b,再查询该表能得到数据 b
C 方法向表中添加数据 c,再查询该表能得到数据 a,b,c
带有注解 @Transactional (propagation=Propagation.REQUIRES_NEW) 的方法走完之后,数据就会被提交入库
另外需要注意方法内部调用 @Transactional (propagation=Propagation.REQUIRES_NEW) 注解不生效,比如 A 和 B 都在同一个方法中,A 调用 B,B 方法是此注解,则不生效。同样,AOP 拦截也拦截不到 B
1 | public enum Propagation { |
七种事物传播类型 默认为: REQUIRED