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

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

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

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

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异常

@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只能回滚RuntimeExceptionRuntimeException下面的子类抛出的异常 不能回滚Exception异常

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

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

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

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
Java API
Swagger 常用注解使用详解
Swagger 常用注解使用详解
418 2
|
Prometheus 监控 Cloud Native
SpringBoot+Prometheus+Grafana 实现自定义监控
SpringBoot+Prometheus+Grafana 实现自定义监控
|
XML Dubbo Java
详解如何自定义Dubbo Filter(含dubbo2.7.X及以上版本和2.6.X及以下版本两种写法)
详解如何自定义Dubbo Filter(含dubbo2.7.X及以上版本和2.6.X及以下版本两种写法)
1967 0
详解如何自定义Dubbo Filter(含dubbo2.7.X及以上版本和2.6.X及以下版本两种写法)
|
NoSQL MongoDB 存储
MongoDB 一致性模型设计与实现
本文源自阅读了 MongoDB 于 VLDB 19 上发表的 [Tunable Consistency in MongoDB](http://www.vldb.org/pvldb/vol12/p2071-schultz.pdf) 论文之后,在内部所做的分享(分享 PPT 见文末)。现在把分享的内容整理成此文,并且补充了部分在之前的分享中略过的细节,以及在分享中没有提及的 MongoDB Causa
2095 0
MongoDB 一致性模型设计与实现
|
存储 消息中间件 Java
SpringBoot整合RocketMQ发送延时消息
当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息
1558 0
|
存储 安全 API
权限设计种类【RBAC、ABAC】
权限设计种类【RBAC、ABAC】
2036 2
|
Java Maven Spring
超实用的SpringAOP实战之日志记录
【11月更文挑战第11天】本文介绍了如何使用 Spring AOP 实现日志记录功能。首先概述了日志记录的重要性及 Spring AOP 的优势,然后详细讲解了搭建 Spring AOP 环境、定义日志切面、优化日志内容和格式的方法,最后通过测试验证日志记录功能的准确性和完整性。通过这些步骤,可以有效提升系统的可维护性和可追踪性。
380 1
|
JSON 缓存 Java
优雅至极!Spring Boot 3.3 中 ObjectMapper 的最佳实践
【10月更文挑战第5天】在Spring Boot的开发中,ObjectMapper作为Jackson框架的核心组件,扮演着处理JSON格式数据的核心角色。它不仅能够将Java对象与JSON字符串进行相互转换,还支持复杂的Java类型,如泛型、嵌套对象、集合等。在Spring Boot 3.3中,通过优雅地配置和使用ObjectMapper,我们可以更加高效地处理JSON数据,提升开发效率和代码质量。本文将从ObjectMapper的基本功能、配置方法、最佳实践以及性能优化等方面进行详细探讨。
1070 2
|
存储 算法 固态存储
CRUSH映射图及自定义规则实战篇
Ceph存储系统中CRUSH映射图及自定义规则的实战教程,涵盖了PG与OSD映射调整、CRUSH运行图修改案例以及CRUSH数据分类管理等内容。
337 1
|
JSON Ubuntu Linux
Docker:镜像加速器
Docker:镜像加速器
21886 4
Docker:镜像加速器