• @Transactional注解加不加 rollbackFor = Exception.class 的区别?


    1、首先我在Mysql中准备了一条数据

    2、简单粗暴的开始测试了

    1、我们的目的是需要把delflag修改为0 简单地准备一下sql

     
    
     
    

    UPDATE tbl_users set delflag='0' where account='admin'

    2、我们先来测试一下@Transactional 代码如下 大家都知道2/0必会抛出异常

     
    
     
    

    @Override @Transactional public Ret test(){ int i = articleMapper.test(); int a = 2/0; if(i > 0){ ResultUtil.success(); } return ResultUtil.error(); }

    3、执行测试 i=1说明更新成功 别着急咱们继续断点往下面走

    4、果然不出所料 执行到第54行的时候报错了 出现了 java.lang.ArithmeticException: /by zero

    5、细心的同学会发现ArithmeticException这个异常类是继承了RuntimeException的

    而@Transactional默认回滚的的异常就是RuntimeException

    6、我们在点进去RuntimeException这个类里面一探究竟 我们发现RuntimeException又是继承Exception的

    而所有的异常类基本都是继承RuntimeException包括刚才上面的 java.lang.ArithmeticException异常

    所以只要是RuntimeException和RuntimeException下面的子类抛出的异常@Transactional都可以回滚的

    7、这个时候我们去看一下数据库的值到底有没有修改成功 很显然数据是被回滚了 并没有修改成0

    1、下面我们在试试@Transactional不能过滚的异常 代码如下

    我们直接先用try catch来捕获异常 然后在catch里面自定义抛出Exception异常

     
    
     
    

    @Override @Transactional public Ret test() throws Exception { int i = articleMapper.test(); try { int a = 2 / 0; } catch (Exception e) { throw new Exception(); } if (i > 0) { ResultUtil.success(); } return ResultUtil.error(); }

    2、ok直接 抛出的异常是我们指定的java.lang.Exception异常 我们去看看数据库

    3、数据库被更新成0了 说明@Transactional并不能回滚Exception异常

    总结一下

    @Transactional只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常

    如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class)

    这里如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)

    补充一下@Transactional(rollbackFor = Exception.class)一些失效的场景:@Transactional 注解失效的3种原因及解决办法

  • 相关阅读:
    C++ 中集合以及集合的相关操作
    动态规划学习总结
    linux 中文乱码 解决方法
    C++从零开始(day47)——set,map学习使用
    localStorage和sessionStorage的使用
    使用新的 NVIDIA Isaac Foundation 模型和工作流程创建、设计和部署机器人应用程序
    【C语言】动态内存管理
    YOLOV9目标检测-训练、验证、推理
    2022蓝帽杯半决赛
    JavaScript基础
  • 原文地址:https://blog.csdn.net/AS011x/article/details/126499041