最近看 @Transactional 相关的博客,发现说事务只会在 Error 和 RuntimeException 时,才会回滚。
所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
非运行时异常,不是通不过编译?!加上 try catch 之后不也会导致事务回滚失效?!
那为什么还要求配置 rollbackFor=Exception.class ??
有点迷惑,有大佬给解解惑吗?
最近看 @Transactional 相关的博客,发现说事务只会在 Error 和 RuntimeException 时,才会回滚。
所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
非运行时异常,不是通不过编译?!加上 try catch 之后不也会导致事务回滚失效?!
那为什么还要求配置 rollbackFor=Exception.class ??
有点迷惑,有大佬给解解惑吗?
|
JasonLawJun 5, 2021 via iPhone
1
我之前提过一个相关的问题 - https://www.v2ex.com/t/771273
|
|
JasonLawJun 5, 2021 via iPhone
2
“ 非运行时异常,不是通不过编译?”是什么意思?
|
|
limuyan44Jun 5, 2021
3
什么是非运行时异常,什么是 unchecked exception,什么是 checked exception 。
|
|
JasonLawJun 5, 2021 via iPhone
6
@ganning #4 方法加上 throws SQLException 就可以了,你可以看看 https://dzone.com/articles/spring-transactional-amp-exceptions
|
|
zm8m93Q1e5otOC69Jun 5, 2021
7
IOException 这种如果 throws 了,不配置 rollbackFor=Exception.class 是不会回滚的
|
|
HuiaoJun 5, 2021
8
所以必须配置 rollbackFor=Exception.class 才会在非运行时异常时,回滚数据。
-------- 所以必须配置 rollbackFor=Exception.class 才会在抛出受检异常时,回滚数据。 关于受检异常和非受检异常 - https://www.cnblogs.com/Qkxh320/p/batj_01_exception.html |
|
9
@JasonLaw 我本地做了一下场景模拟,确实是这样。方法上 throws Exception 了,那么 rollbackFor=Exception.class 就是有意义的。学到了
@beichenhpy 是这样的,学到了学到了 |
|
10
@Huiao 嗯嗯,明白了。我钻了有异常就要捕获处理的牛角尖。抛出非运行时异常时,那么只有配置 rollbackFor=Exception.class 事务才会回滚
|
|
zm8m93Q1e5otOC69Jun 5, 2021
11
@ganning #10 其实也可以给非运行时异常 try catch 然后在 catch 中抛一个 RuntimeException 或者他的子类就行(狗头
|
|
12
@beichenhpy 禁止套娃😹
|
|
beitayongguoJun 5, 2021
13
日常都会加 你不知道框架那里会给你抛啥奇奇怪怪的异常
|
|
securityCodingJun 6, 2021 via Android
14
jdbc 就是通过判断异常确定是否需要回滚,这是病
|
|
xiangyuecnJun 6, 2021
15
我能明确业务成功完成时需要提交事务,但不能决定业务中途的退出( return 、throw )是否一要提交事务
所以:明确开启事务的情况下,没有提交的事务一律应当自动回滚,而不是自动提交! 改成手动提交什么事情都没有,吐槽一下 |