[seata]事务提交返回TimeoutRollbacking未抛异常

2024-07-15 585 views
4

TM向TC发起事务提交时,TC返回了状态TimeoutRollbacking, 但没有抛出异常,导致TM认为事务提交成功,实际TC推动各个RM进行了回滚。

事务提交返回TimeoutRollbacking未抛异常

在事务中执行业务逻辑代码超出分布式事务的超时时长,就会发生

参考代码

  • io.seata.tm.api.TransactionalTemplate#execute
  • io.seata.tm.api.DefaultGlobalTransaction#commit
  • JDK version : 1.8
  • Seata version: 1.4.2
  • OS : CentOS
  • Others:

回答

7

plz assign to me

0

@Bughue 我发现的问题是在这里,提交事务时,事务并没有提交成功,但没有向业务代码抛出异常: https://github.com/seata/seata/blob/8f96afa3d4df5128ed80edae988e044c27e2f81a/tm/src/main/java/io/seata/tm/api/TransactionalTemplate.java#L135

目前我遇到了两种情况:

  • 如果在TM决议提交事务前,TC发现事务超时主动进行了回滚,TM在提交事务时,返回的事务状态为Finished, 但不会向业务代码抛出异常,导致业务代码认为事务提交成功。
  • 如果在TM进行事务提交时,TC发现事务已经超时了,会返回TimeoutRollbacking和回滚所有分支事务,TM端也不会向业务代码抛出异常,导致业务代码认为提交成功
9

你碰到的应该和我的是一样的,所以总结一下,现在的问题是TM拿不到正确的结果对吗?而TC和RM都是正确的?

5

@Bughue 是的。事务本身回滚了,但TM认为事务提交了

7

第一种情况,finish应该是因为TC早就回滚成功,而且自动任务甚至都把他给清干净了。按说TC不会提前这么多的,你们是真的遇到这种情况吗?是不是debug把他卡太久来验证的? 第二种情况,我提了个pr,应该可以修复这个问题。

2

第一种情况是在压测时产生的,TC服务器由于性能不足,导致提交超时