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