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

2021-06-05 15:39:45 +08:00
 ganning

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

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

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

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

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

2426 次点击
所在节点    Java
15 条回复
JasonLaw
2021-06-05 15:44:00 +08:00
我之前提过一个相关的问题 - https://www.v2ex.com/t/771273
JasonLaw
2021-06-05 15:44:58 +08:00
“ 非运行时异常,不是通不过编译?”是什么意思?
limuyan44
2021-06-05 15:48:30 +08:00
什么是非运行时异常,什么是 unchecked exception,什么是 checked exception 。
ganning
2021-06-05 15:49:26 +08:00
@JasonLaw 比如模拟一个非运行时异常,抛出一个 SQLException 。这个时候编译器会提示错误,让去处理这个异常
ganning
2021-06-05 15:52:40 +08:00
@limuyan44 非运行时异常就是受检异常,运行时异常就是非受检异常
JasonLaw
2021-06-05 15:52:43 +08:00
@ganning #4 方法加上 throws SQLException 就可以了,你可以看看 https://dzone.com/articles/spring-transactional-amp-exceptions
uselessVisitor
2021-06-05 15:59:24 +08:00
IOException 这种如果 throws 了,不配置 rollbackFor=Exception.class 是不会回滚的
Huiao
2021-06-05 16:02:37 +08:00
所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
--------

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

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

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

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

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

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

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

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

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

© 2021 V2EX