@Transactional VS @Transactional(rollbackFor = Exception.class)

2021-04-17 14:18:25 +08:00
 JasonLaw

到底什么场景会使用到Transactional(rollbackFor = Exception.class)

额外阅读

3009 次点击
所在节点    Java
17 条回复
Paosin
2021-04-17 15:19:31 +08:00
学到了😂
siweipancc
2021-04-17 16:43:34 +08:00
……不明所以
JasonLaw
2021-04-17 16:51:19 +08:00
@siweipancc #2 ?
xuanbg
2021-04-17 16:59:59 +08:00
这篇文章里面的示例,调用同一个类的方法,事务不起作用的吧。
siweipancc
2021-04-17 17:00:12 +08:00
@JasonLaw :D 又重看了一次,我还是看不懂
crclz
2021-04-17 17:02:42 +08:00
根据 https://www.cnblogs.com/clwydjgs/p/9317849.html:

在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事物只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

可以理解是,假设你始终使用 RuntimeException (遵循 kotlin 和 C#的风格),那么就只需要用 @Transactional 。我的建议是:Exception 有害,请遵循 kotlin 和 C#的风格。
JasonLaw
2021-04-17 17:06:36 +08:00
@xuanbg #4 虽然 transferMoney 调用了同一个 class 中的方法,但是是外部调用 transferMoney 的,所以`@Transactional`是起作用的。
JasonLaw
2021-04-17 17:07:07 +08:00
@siweipancc #5 你说的看是看什么😅?
JasonLaw
2021-04-17 17:11:26 +08:00
@crclz #6 所以我一直在纠结,在被`@Transactional`标注的方法上,什么时候会声明`throws Exception`?
securityCoding
2021-04-17 17:16:38 +08:00
推荐看一下 @Transactional 的原理.
本质上 jdbc 是通过捕捉异常来判断是否需要回滚,所以才有指定异常回滚这种用法
gdtdpt
2021-04-17 17:26:32 +08:00
@JasonLaw 偷懒的时候吧,比如逻辑部分会 throw 多种 Exception 子类,不想在 throws 里写全,直接写个 Exception
jin7
2021-04-17 17:37:44 +08:00
@transactional(rollbackfor = throwable.class) 有没有必要?
taogen
2021-04-17 21:17:46 +08:00
@jin7 #12

"In its default configuration, the Spring Framework's transaction infrastructure code only marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException. (Errors will also - by default - result in a rollback). Checked exceptions that are thrown from a transactional method do not result in rollback in the default configuration."

- https://docs.spring.io/spring-framework/docs/3.2.6.RELEASE/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back

1. default rollback for unchecked exceptions
2. Errors will also - by default - result in a rollback

So recommend specifying rollback for Excpetion class.
JasonLaw
2021-04-17 21:57:02 +08:00
@taogen #13 "So recommend specifying rollback for Excpetion class."是在哪里出现的?没有找到
bxb100
2021-04-17 23:34:25 +08:00
一般都是全捕捉然后回滚
taogen
2021-04-18 22:25:19 +08:00
@JasonLaw 这句话是我自己总结的 😁
ychost
2021-04-19 10:07:28 +08:00
我一直觉得 Java 的 checked Exception 有点鸡肋,看上去很能帮助用户意识到方法可能会抛什么 exception,但是真实的工程项目里面用着贼操蛋

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

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

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

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

© 2021 V2EX