try-catch捕获异常信息后Spring事务失效处理方法
一、首先在Spring Boot项目中,手动添加异常方法进行测试
@Transactional(rollbackFor=Exception.class) //表示此方法有异常时触发Spring事务
@Override
public CommonResult<User> saveUser(User user) {int insert = baseMapper.insert(user);try {// 添加异常,并进行捕获int a = 10/0;}catch (Exception e){logger.info("打印异常信息:"+e);return CommonResult.commentFailure("服务器异常,事务回滚");}if(insert > 0){return CommonResult.commentSuccess(user);}else {return CommonResult.commentFailure("添加失败");}
}
1、一个添加信息的实现类方法上,此处我们加了Spring的事务。
2、问题:一个方法报异常(int a = 10/0)进行了异常捕获,另一个方法不会回滚(insert添加方法)
这是什么情况呢,相当于Spring事务策略失效了。
try-catch捕获了异常后,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。
通俗的来说:默认spring事务只在发生未被捕获的 runtimeexcetpion或error时才回滚。
二、处理方案一
spring aop 异常捕获进而回滚。在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚,缺点是无法return异常信息提示,前端用户交互效果不佳
@Transactional(rollbackFor=Exception.class) //表示此方法有异常时触发Spring事务
@Override
public CommonResult<User> saveUser(User user) {int insert = baseMapper.insert(user);try {// 添加异常,并进行捕获int a = 10/0;}catch (Exception e){logger.info("异常信息:"+e);// 方案一:spring aop 异常捕获throw new RuntimeException();}if(insert > 0){return CommonResult.commentSuccess(user);}else {return CommonResult.commentFailure("添加失败");}
}
三、处理方案二
就是让一个方法报异常,另一个方法回滚,这样才能真正的触发Spring事务回滚策略。
catch语句中增加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了
完整代码:
@Transactional(rollbackFor=Exception.class) //表示此方法有异常时触发Spring事务
@Overridepublic CommonResult<User> saveUser(User user) {int insert = baseMapper.insert(user);try {// 添加异常,并进行捕获int a = 10/0;}catch (Exception e){logger.info("异常信息:"+e);// 方案二:手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return CommonResult.commentFailure("服务器异常,事务回滚");}if(insert > 0){return CommonResult.commentSuccess(user);}else {return CommonResult.commentFailure("添加失败");}}
三、如过需要手动进行手动回滚的业务方法比较多,我们可以写一个公共的工具类
SpringRollBackUtil.java
public class SpringRollBackUtil {/*** 事务回滚机制*/public static void rollBack() {try {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();} catch (Exception e) {e.printStackTrace();}}
}
只需调用方法即可
// 方案三:公共工具类 手动回滚
SpringRollBackUtil.rollBack();
try-catch捕获异常信息后Spring事务失效处理方法相关推荐
- 详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制:好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Sprin ...
- 面试官:Spring事务失效的场景有哪些?如何解决?
作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...
- 你否有遇到Spring事务失效,花费太多时间找bug
作者:溪~源 来源:blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事 ...
- 8个Spring事务失效的场景,你碰到过几种?
前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...
- 详解spring事务失效和回滚失败的场景
详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...
- Spring 事务失效?看这篇文章就够了!
欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...
- Spring 事务失效的 8 大场景,看看你都遇到过几个?
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/Yang_yangyang/ article/details/114359881 用 Spring 的 @Transaction ...
- spring事务失效了? @Transactional不管用了 ?看看这些@Transation的坑
spring事务失效了? @Transactional不管用了 ?看看这些@Transactional的坑 文章目录 spring事务失效了? @Transactional不管用了 ?看看这些@Tra ...
- Spring事务失效 -方法内部调用
首先感谢网友的文章 Spring事务失效的2种情况 JDK动态代理给Spring事务埋下的坑 前提知识: 两个前提 1 注解使用 spring容器的事务管理注解 @org.springframewor ...
最新文章
- How to check Laravel version?
- jupyter notebook修改默认工作目录
- Kubernetes — Helm 软件包管理工具
- iphone导出通讯录到安卓_如何把旧手机的便签数据转移到新的iPhone手机上?
- 深度学习和目标检测系列教程 6-300:目标检测Fast-RCNN架构
- Centos7构建NFS服务器和连接
- SQL查询重复记录,删除重复记录
- sun.java2d.fontpath,java起用默认浏览器
- 故宫回应灯会票秒光:3500人约成功 没票别信黄牛
- java zip解压抛出异常,java – ZipFile抛出错误,但ZipInputStream能够解压缩归档
- 智慧灯杆智能网关喷雾降尘系统
- 小D的一串数字(简单DP)
- Qt:Windows编程—Qt实现注册表启动项管理
- outlook安全模式修复_Outlook Com安全漏洞Microsoft无法修复
- 俄罗斯套娃程序java_原创(俄罗斯套娃程序) | 学步园
- 《成为沃伦·巴菲特》笔记与感想
- 【Verilog 语法】~ 关键字、运算符、数据类型、缩位运算、三态门设计、可综合、VHDL 的结构、VHDL:WAIT 语句格式、原语、编译预处理
- OpenGL ES EGL eglSwapBuffer
- 毕业生新手如何入门新媒体运营岗位
- 【Visual Studio Code】自动更新失败解决方法