当前位置:网站首页>@Transactional注解加不加 rollbackFor = Exception.class 的区别?

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

2022-08-11 11:33:00 Java知音_

点击关注公众号,实用技术文章及时了解e7ea3f64044b0177c2ac3ff746bc1c75.png

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

77b96dca377fbf748eb739134d410f8d.png

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

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

<update id="test">
        UPDATE tbl_users set delflag='0' where account='admin'
 </update>

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说明更新成功 别着急咱们继续断点往下面走

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

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

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

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

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

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

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

ab7190c405eeb0b25777a656b8eee368.png

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异常 我们去看看数据库

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

bc1211bb2f174528980618110820b87b.png

总结一下

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

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

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

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

来源:blog.csdn.net/weixin_42169734/article/

details/117122084

推荐
Java面试题宝典
技术内卷群,一起来学习!!


PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
原网站

版权声明
本文为[Java知音_]所创,转载请带上原文链接,感谢
https://dalin.blog.csdn.net/article/details/126277320