两个 Service A 的方法 A 没有加 @Transactional 和 Service B ;
Service A 的方法 A 没有加 @Transactional ;
Service B 的方法 B 添加 @Transactional ;
方法 A 调用方法 B ,方法 B 出错,抛全局异常,
为什么会去回滚到 controller 里,再执行一次。
相当于 B 抛出全局异常后, 这个接口执行了两遍
1 Hurriance 2021-11-05 16:52:39 +08:00 回滚到 controller ? debug 的过程是怎样的 |
2 kikione OP @Hurriance debug 就是 抛出异常后,又从 controller 执行一遍,我把 @Transactional 放在方法 A ,就不会重复执行了,直接返回异常 |
4 Hurriance 2021-11-05 17:06:33 +08:00 可以的话,贴个代码吧 |
![]() | 5 thetbw 2021-11-05 17:10:37 +08:00 应该是代码写的问题的,看看是不是接口哪里掉了两次,事务仅仅是数据库层面的回滚吧 |
![]() | 6 nonoyang 2021-11-05 17:29:02 +08:00 via iPhone ![]() 刚下班,我他妈连第一句都看不懂…… |
7 没下班, 第一句我也看不懂...... |
![]() | 9 clf 2021-11-05 17:37:18 +08:00 你怎么判断 Controller 接口执行了两次的? 另外建议贴代码。 |
![]() | 10 siweipancc 2021-11-05 18:14:46 +08:00 via iPhone 控制层打印一下当前线程 id |
11 NutChocHoney 2021-11-05 18:14:50 +08:00 断点放掉的一瞬间又有人走这个方法了吧 |
![]() | 12 yqsas 2021-11-05 22:06:28 +08:00 via iPad 猜测 serviceA 那边开启了调用异常,自动重试功能 |
13 cp19890714 2021-11-06 01:16:53 +08:00 你提出了两个问题。 1. 事务回滚到了 controller ,也就是说 A 中的数据也回滚了。 2. controller 执行了两次 回答: 1. 请说明你的证据 2. 最大可能就是异常触发重试 |
![]() | 14 LeeSeoung 2021-11-06 11:28:20 +08:00 大概率是用的框架做了重试。。 |
15 leatomic 2021-11-07 11:45:13 +08:00 只能说 talk is cheap 了 |
![]() | 16 tedzhou1221 2021-11-08 08:56:39 +08:00 你可以 debug 一下,看看整个调用栈的过程 |
17 notwaste 2021-11-15 14:09:59 +08:00 盲猜用了 spring retry |