前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@Transactional注解加不加 rollbackFor = Exception.class 的区别?

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

作者头像
芋道源码
发布2022-08-29 12:03:32
3370
发布2022-08-29 12:03:32
举报
文章被收录于专栏:芋道源码1024芋道源码1024

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

来源:blog.csdn.net/weixin_42169734/

article/details/117122084


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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

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

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

代码语言:javascript
复制
 <update id="test">
        UPDATE tbl_users set delflag='0' where account='admin'
 </update>

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

代码语言:javascript
复制
  @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异常

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

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

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

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

代码语言:javascript
复制
@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异常

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

总结一下

@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 管理)



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

代码语言:javascript
复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、首先我在Mysql中准备了一条数据
  • 2、简单粗暴的开始测试了
  • 总结一下
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档