一、首先在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事务失效处理方法相关推荐

  1. 详细整理Spring事务失效的具体场景及解决方案

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制:好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Sprin ...

  2. 面试官:Spring事务失效的场景有哪些?如何解决?

     作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...

  3. 你否有遇到Spring事务失效,花费太多时间找bug

    作者:溪~源 来源:blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事 ...

  4. 8个Spring事务失效的场景,你碰到过几种?

    前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...

  5. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

  6. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

  7. Spring 事务失效的 8 大场景,看看你都遇到过几个?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/Yang_yangyang/ article/details/114359881 用 Spring 的 @Transaction ...

  8. spring事务失效了? @Transactional不管用了 ?看看这些@Transation的坑

    spring事务失效了? @Transactional不管用了 ?看看这些@Transactional的坑 文章目录 spring事务失效了? @Transactional不管用了 ?看看这些@Tra ...

  9. Spring事务失效 -方法内部调用

    首先感谢网友的文章 Spring事务失效的2种情况 JDK动态代理给Spring事务埋下的坑 前提知识: 两个前提 1 注解使用 spring容器的事务管理注解 @org.springframewor ...

最新文章

  1. How to check Laravel version?
  2. jupyter notebook修改默认工作目录
  3. Kubernetes — Helm 软件包管理工具
  4. iphone导出通讯录到安卓_如何把旧手机的便签数据转移到新的iPhone手机上?
  5. 深度学习和目标检测系列教程 6-300:目标检测Fast-RCNN架构
  6. Centos7构建NFS服务器和连接
  7. SQL查询重复记录,删除重复记录
  8. sun.java2d.fontpath,java起用默认浏览器
  9. 故宫回应灯会票秒光:3500人约成功 没票别信黄牛
  10. java zip解压抛出异常,java – ZipFile抛出错误,但ZipInputStream能够解压缩归档
  11. 智慧灯杆智能网关喷雾降尘系统
  12. 小D的一串数字(简单DP)
  13. Qt:Windows编程—Qt实现注册表启动项管理
  14. outlook安全模式修复_Outlook Com安全漏洞Microsoft无法修复
  15. 俄罗斯套娃程序java_原创(俄罗斯套娃程序) | 学步园
  16. 《成为沃伦·巴菲特》笔记与感想
  17. 【Verilog 语法】~ 关键字、运算符、数据类型、缩位运算、三态门设计、可综合、VHDL 的结构、VHDL:WAIT 语句格式、原语、编译预处理
  18. OpenGL ES EGL eglSwapBuffer
  19. 毕业生新手如何入门新媒体运营岗位
  20. 【Visual Studio Code】自动更新失败解决方法

热门文章

  1. 信息学奥赛一本通(1068:与指定数字相同的数的个数)
  2. 动态规划 —— 概率 DP 与期望 DP
  3. 计算多项式的值(信息学奥赛一本通-T1012)
  4. 6 如何查看MESSAGE消息
  5. 公司的计算机邮箱找不到了,找不到我现在的邮箱
  6. CSP-S/J2019认证相关内容
  7. java生成pdf417_生成PDF417的JAVA包.rar
  8. 输出图片任意点的像素坐标(结合IRFANVIEW使用)
  9. 【tensorflow】张量tensor--数据容器(把它想象成一个数字的水桶)
  10. java 查询windows进程_Oracle查询语句,你知道几个?(下)