@Transactional 注解里的 rollbackFor=Exception.class 是否真的有意义?!

2021 年 6 月 5 日
 ganning

最近看 @Transactional 相关的博客,发现说事务只会在 Error 和 RuntimeException 时,才会回滚。

所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。

非运行时异常,不是通不过编译?!加上 try catch 之后不也会导致事务回滚失效?!

那为什么还要求配置 rollbackFor=Exception.class ??

有点迷惑,有大佬给解解惑吗?

3756 次点击
所在节点    Java
15 条回复
JasonLaw
2021 年 6 月 5 日
我之前提过一个相关的问题 - https://v2ex.ih06.com/t/771273
JasonLaw
2021 年 6 月 5 日
“ 非运行时异常,不是通不过编译?”是什么意思?
limuyan44
2021 年 6 月 5 日
什么是非运行时异常,什么是 unchecked exception,什么是 checked exception 。
ganning
2021 年 6 月 5 日
@JasonLaw 比如模拟一个非运行时异常,抛出一个 SQLException 。这个时候编译器会提示错误,让去处理这个异常
ganning
2021 年 6 月 5 日
@limuyan44 非运行时异常就是受检异常,运行时异常就是非受检异常
JasonLaw
2021 年 6 月 5 日
@ganning #4 方法加上 throws SQLException 就可以了,你可以看看 https://dzone.com/articles/spring-transactional-amp-exceptions
zm8m93Q1e5otOC69
2021 年 6 月 5 日
IOException 这种如果 throws 了,不配置 rollbackFor=Exception.class 是不会回滚的
Huiao
2021 年 6 月 5 日
所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
--------

所以必须配置 rollbackFor=Exception.class 才会在抛出受检异常时,回滚数据。

关于受检异常和非受检异常 - https://www.cnblogs.com/Qkxh320/p/batj_01_exception.html
ganning
2021 年 6 月 5 日
@JasonLaw 我本地做了一下场景模拟,确实是这样。方法上 throws Exception 了,那么 rollbackFor=Exception.class 就是有意义的。学到了

@beichenhpy 是这样的,学到了学到了
ganning
2021 年 6 月 5 日
@Huiao 嗯嗯,明白了。我钻了有异常就要捕获处理的牛角尖。抛出非运行时异常时,那么只有配置 rollbackFor=Exception.class 事务才会回滚
zm8m93Q1e5otOC69
2021 年 6 月 5 日
@ganning #10 其实也可以给非运行时异常 try catch 然后在 catch 中抛一个 RuntimeException 或者他的子类就行(狗头
ganning
2021 年 6 月 5 日
@beichenhpy 禁止套娃😹
beitayongguo
2021 年 6 月 5 日
日常都会加 你不知道框架那里会给你抛啥奇奇怪怪的异常
securityCoding
2021 年 6 月 6 日
jdbc 就是通过判断异常确定是否需要回滚,这是病
xiangyuecn
2021 年 6 月 6 日
我能明确业务成功完成时需要提交事务,但不能决定业务中途的退出( return 、throw )是否一要提交事务

所以:明确开启事务的情况下,没有提交的事务一律应当自动回滚,而不是自动提交!

改成手动提交什么事情都没有,吐槽一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/781561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX