关于Spring嵌套事务异常问题
关于Spring嵌套事务异常问题
异常截图
异常信息: Transaction silently rolled back because it has been marked as rollback-only
代码展示
UserServiceImpl
@Transactional(rollbackFor = Exception.class)
public void test(){friendService.saveFriend(10000000000L, Arrays.asList(10000000000L));try {friendService.test();}catch (Exception e){e.printStackTrace();}System.out.println("123");}
FriendServiceImpl
@Transactional
public void test() {System.out.println(1/0);friendRepo.deleteByUid(10000000000L);
}
UserTest
@Autowired
private UserService userService;@Test
public void test(){userService.test();
}
产生原理
两个方法都加了事务注解,并且两个方法都会受到到事务管理的拦截器增强,并且事务传播的方式都是默认的,也就是REQUIRED,当已经存在事务的时候就加入事务,没有就创建事务。这里A和B都受事务控制,并且是处于同一个事务的。
A调用B,A中抓了B的异常,当B发生异常的时候,B的操作应该回滚,但是A吃了异常,A方法中没有产生异常,所以A的操作又应该提交,二者是相互矛盾的。
spring的事务关联拦截器在抓到B的异常后就会标记rollback-only为true,当A执行完准备提交后,发现rollback-only为true,也会回滚,并抛出异常告诉调用者。
抑制异常方式
1.在catch中添加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2.尽量不要再service中try-cache
扩展
spring的事务处理方式才用的是AOP模式,走的是代理。当内部方法嵌套调用则并不会走代理就不会产生事务嵌套异常。需要走代理则采用注入类方式调用。
关于Spring嵌套事务异常问题相关推荐
- Spring嵌套事务异常Transaction rolled back because it has been marked as rollback-only
项目场景: 在循环里面使用try-catch去捕获异常的时候,并且try里面调的方法它也使用了事务注解 @transactional或者用了事务切面AOP去实现方法事务注入 问题描述 我这里的业务需求 ...
- java 事务嵌套_解惑 spring 嵌套事务
解惑spring嵌套事务 在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一 ...
- spring全局异常抓取validation校验信息
spring全局异常抓取validation校验信息 参考文章: (1)spring全局异常抓取validation校验信息 (2)https://www.cnblogs.com/jianxiaopo ...
- spring mvc异常统一处理(ControllerAdvice注解)
spring mvc异常统一处理(ControllerAdvice注解) 参考文章: (1)spring mvc异常统一处理(ControllerAdvice注解) (2)https://www.cn ...
- spring boot 异常(exception)处理
spring boot 异常(exception)处理 参考文章: (1)spring boot 异常(exception)处理 (2)https://www.cnblogs.com/jinbuqi/ ...
- Spring事务异常回滚,try catch 捕获异常不回滚
Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...
- Spring事务异常回滚,捕获异常不抛出就不会回滚
Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...
- Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...
- org.mybatis.spring.MyBatisSystemException异常及处理
org.mybatis.spring.MyBatisSystemException异常及处理 参考文章: (1)org.mybatis.spring.MyBatisSystemException异常及 ...
最新文章
- Xcode(7.0以上版本)真机调试
- 基于有限元方法的薄板冲压成型过程的程序仿真
- Collection中list集合的应用常见的方法
- 论文浅尝 | 基于Universal Schema与Memory Network的知识+文本问答
- 哈佛大学教授:排名前5%学生的秘诀就3个字,这比勤奋更重要!
- SpringMVC报错The request sent by the client was syntactically incorrect ()
- cef3实现点击按钮弹出页面_Cef功能开发经验总结
- 五分钟学会文献管理神器—— Zotero
- DHCP的IP地址租约、释放
- 利用Excel处理OTU表
- 键盘录入(身高和体重)
- 生产用料清单-在制材料数量
- PRTG网络监控软件
- ncverilog脚本_Ncverilog 常用命令使用详解 | 学步园
- python处理Jenkins Job配置文件config.xml
- 3D语音天气球(源码分享)本文出自大苞米的博客(http://blog.csdn.net/a396901990)
- java 草稿_JAVA生成一张草稿
- WEBGL 2D游戏引擎研发系列 第三章 正交视口
- ️前端研发的新基础设施 - Rust ️
- 表格图片加载不出来,破图,加载失败