spring 事务问题

2021-11-05 16:48:28 +08:00
 kikione

两个 Service A 的方法 A 没有加 @Transactional 和 Service B ;

Service A 的方法 A 没有加 @Transactional

Service B 的方法 B 添加 @Transactional

方法 A 调用方法 B ,方法 B 出错,抛出全局异常,

为什么会去回滚到 controller 里,再执行一次。

相当于 B 抛出全局异常后, 这个接口执行了两遍

2845 次点击
所在节点    Java
17 条回复
Hurriance
2021-11-05 16:52:39 +08:00
回滚到 controller ? debug 的过程是怎样的
kikione
2021-11-05 17:01:58 +08:00
@Hurriance debug 就是 抛出异常后,又从 controller 执行一遍,我把 @Transactional 放在方法 A ,就不会重复执行了,直接返回异常
kikione
2021-11-05 17:06:16 +08:00
@Hurriance 不太清楚什么原理
Hurriance
2021-11-05 17:06:33 +08:00
可以的话,贴个代码吧
thetbw
2021-11-05 17:10:37 +08:00
应该是代码写的问题的,看看是不是接口哪里掉了两次,事务仅仅是数据库层面的回滚吧
nonoyang
2021-11-05 17:29:02 +08:00
刚下班,我他妈连第一句都看不懂……
ZeawinL
2021-11-05 17:30:36 +08:00
没下班, 第一句我也看不懂......
kikione
2021-11-05 17:30:38 +08:00
@nonoyang 第一句写错了 我的
clf
2021-11-05 17:37:18 +08:00
你怎么判断 Controller 接口执行了两次的?

另外建议贴代码。
siweipancc
2021-11-05 18:14:46 +08:00
控制层打印一下当前线程 id
NutChocHoney
2021-11-05 18:14:50 +08:00
断点放掉的一瞬间又有人走这个方法了吧
yqsas
2021-11-05 22:06:28 +08:00
猜测 serviceA 那边开启了调用异常,自动重试功能
cp19890714
2021-11-06 01:16:53 +08:00
你提出了两个问题。
1. 事务回滚到了 controller ,也就是说 A 中的数据也回滚了。
2. controller 执行了两次

回答:
1. 请说明你的证据
2. 最大可能就是异常触发重试
LeeSeoung
2021-11-06 11:28:20 +08:00
大概率是用的框架做了重试。。
leatomic
2021-11-07 11:45:13 +08:00
只能说 talk is cheap 了
tedzhou1221
2021-11-08 08:56:39 +08:00
你可以 debug 一下,看看整个调用栈的过程
notwaste
2021-11-15 14:09:59 +08:00
盲猜用了 spring retry

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

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

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

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

© 2021 V2EX