彻底弄懂@Transactional和@Transactional(rollbackFor = Exception.class)的区别到底在哪里

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

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

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


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

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


     
     
  1. @Override
  2. @Transactional
  3. public Ret test (){
  4. int i = articleMapper.test();
  5. int a = 2/ 0;
  6. if(i > 0){
  7. ResultUtil.success();
  8. }
  9. return ResultUtil.error();
  10. }

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

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

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

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

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

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

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

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

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

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


     
     
  1. @Override
  2. @Transactional
  3. public Ret test () throws Exception {
  4. int i = articleMapper.test();
  5. try {
  6. int a = 2 / 0;
  7. } catch (Exception e) {
  8. throw new Exception();
  9. }
  10. if (i > 0) {
  11. ResultUtil.success();
  12. }
  13. return ResultUtil.error();
  14. }

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

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

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

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

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

补充一下@Transactional(rollbackFor = Exception.class)一些失效的场景

1、不是用public修饰

2、try catch捕获了异常(没有在catch里面手动抛出异常)

3、没有加@Service(也就是没有被 Spring 管理)

具体的补充可以看一下这位博主

https://blog.csdn.net/qq_43399077/article/details/103892010

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值