@Transactional加不加rollbackFor=Exception.class的区别?
上周,一同事看到我去年写的一些代码,@Transactional 加上了 rollbackFor,就问我为什么。我当时和他解释了一番,这里我分享出来,希望能够帮助到更多的人。
彻底弄懂@Transactional
和@Transactional(rollbackFor = Exception.class)
的区别到底在哪里!
准备数据
首先我在 Mysql 中准备了一条数据,如下所示:
开始测试
下面我们就开始简单粗暴的测试了。
- 我们的目的是需要把
delflag
修改为 0,简单的准备一下 sql。
<update id="test">
UPDATE tbl_users set delflag='0' where account='admin'
</update>
- 接着我们先来测试一下
@Transactional
代码如下。大家都知道2/0
必会抛出异常
@Override
@Transactional
public Ret test(){
int i = articleMapper.test();
int a = /;
if(i > ){
ResultUtil.success();
}
return ResultUtil.error();
}
- 执行测试。
当i=1
说明更新成功,别着急咱们继续断点往下面走。
- 果然不出所料,执行到第 54 行的时候报错了。出现了
java.lang.ArithmeticException: /by zero
- 细心的同学会发现
ArithmeticException
这个异常类是继承了RuntimeException
类的
当我们在使用@Transactional
且不加rollbackFor
,然后抛出上面的异常时,数据库回滚了。
原因是:@Transactional
默认回滚的的异常就RuntimeException
类型的。只要是RuntimeException
类型的,和它子类型的异常,默认的都能回滚。
- 我们现在点进去看
RuntimeException
这个类里面一探究竟。我们发现RuntimeException
又是继承Exception
的。
大多数自定义异常类基本都是继承RuntimeException
包括刚才上面的java.lang.ArithmeticException
异常。
所以只要是RuntimeException
和RuntimeException
下面的子类抛出的异常@Transactional
都是可以回滚的。
- 这个时候我们去看一下数据库的值到底有没有修改成功,很显然数据是被回滚了。并没有修改成0。
下面我们再试试@Transactional
不能回滚的异常。代码如下:
我们直接先用try catch
来捕获异常,然后在catch
里面自定义抛出Exception
异常。
@Override
@Transactional
public Ret test() throws Exception {
int i = articleMapper.test();
try {
int a = / ;
} catch (Exception e) {
throw new Exception();
}
if (i > ) {
ResultUtil.success();
}
return ResultUtil.error();
}
ok 直接,抛出的异常是我们指定的java.lang.Exception
异常。我们去看看数据库:
数据库被更新成0了,说明@Transactional
并不能回滚Exception
异常。
总结一下:@Transactional
只能回滚RuntimeException
和RuntimeException
下面的子类抛出的异常,不能回滚Exception
异常。
如果需要支持回滚Exception
异常请用@Transactional(rollbackFor = Exception.class)
。
这里如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)
。
补充一下@Transactional(rollbackFor = Exception.class)
一些失效的场景。
- 不是用
public
修饰 try catch
捕获了异常(没有在catch
里面手动抛出异常)- 没有加
@Service
(也就是没有被Spring
管理) - 。。。
具体有好几种,我历史文章中有过详细的介绍,这里就不在细说了。
相关文章
- 个人笔记(路由、网络相关)
- 个人笔记(vue篇)
- 怎么去水印不伤原图?这个去水印方法值得收藏!
- 羊了个羊,通关秘籍!
- 实用 | 盘点抓包修改响应结果的 2 种方式!
- 小技巧 | Chrome 插件如何完成剪切板的操作!
- DDOS攻击讲堂
- 思科交换机简单配置
- 实战 | 如何利用 Scrapy 编写一个完整的爬虫!
- 超简单就可做一款三功能的LED车灯
- 实战 | 教你快速爬取热门股票,辅助量化交易!
- 行业趋势|光伏行业SCM供应链数字化管理优势、价值
- 破除上下游梗阻,如何为能源化工行业开出“新良方”?
- 软件分享 | 第一期 Markdown神器Typora安装和破解教程
- jira-dev-tool插件安装失败的解决方法
- 软件分享 | 第二期 截图神器snipaste安装和使用教程
- 基于Hexo搭建静态博客
- 软件分享 | 第三期 搜索神器listary安装和使用
- 发送HTML模板邮件
- 使用3-hexo主题时无法正常渲染html代码