赞
踩
目录
示例三:A使用默认事务注解,B使用新事务注解:@Transactional(propagation = Propagation.REQUIRES_NEW)
Spring事务嵌套的相关问题:
我们先了解下Spring的事务及原理。参见:深入理解 Spring 事务原理。
外层事务 Service A 的 Method A() 调用 内层Service B 的 Method B()
- ServiceA {
- void methodA() {
- ServiceB.methodB();
- }
- }
- ServiceB {
- void methodB() {
- }
- }
Spring 事务的传播属性默认为PROPAGATION_REQUIRED
参见:Spring事务与异常
默认事务只对error和runtimeException异常会进行回滚,其他异常不会回滚,加上@Transactional(rollbackFor=MyException.class)后事务会捕捉到此类异常。
A事务 | B事务 | 回滚情况 |
正常(未捕获B异常) | 异常 | A回滚,B回滚 |
正常(捕获B异常,未抛出) | 异常 | A回滚,B回滚,但出现了异常(Transaction rolled back because it has been marked as rollback-only) |
正常(捕获B异常,抛出异常) | 异常 | A回滚,B回滚 |
异常 | 正常 | A回滚,B回滚 |
A事务 | B事务 | 回滚情况 |
正常(未捕获B异常) | 异常 | A回滚,B回滚 |
正常(捕获B异常,未抛出) | 异常 | A,B都不回滚 |
正常(捕获B异常,抛出异常) | 异常 | A回滚,B回滚 |
异常 | 正常 | A回滚,B回滚 |
A事务 | B事务 | 回滚情况 |
正常(未捕获B异常) | 异常 | A回滚,B回滚 |
正常(捕获B异常,未抛出) | 异常 | A不会滚,B回滚 |
正常(捕获B异常,抛出异常) | 异常 | A回滚,B回滚 |
异常 | 正常 | A回滚,B不回滚 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。