apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.33k stars 8.78k forks source link

TransactionHook没有被正确clear #6880

Open 0x9bb1 opened 1 month ago

0x9bb1 commented 1 month ago

Ⅰ. Issue Description

Ⅱ. Describe what happened

  1. 时刻1开启事务1,线程[http-nio-8089-exec-14]在添加TransactionHook,实现afterRollback方法。事务1成功提交。
  2. 时刻2开启事务2,事务2异常回滚后,线程[http-nio-8089-exec-14]执行了afterRollback方法内逻辑。
Just paste your stack trace here!

Ⅲ. Describe what you expected to happen

Ⅳ. How to reproduce it (as minimally and precisely as possible)

  1. xxx
  2. xxx
  3. xxx

Minimal yet complete reproducer code (or URL to code):

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

funky-eyes commented 1 month ago

https://github.com/apache/incubator-seata/pull/4555

0x9bb1 commented 1 month ago

4555

恕我愚钝...这是为hook添加了xid参数,这似乎与我的case关系不大,麻烦再提点一下

funky-eyes commented 1 month ago

4555

恕我愚钝...这是为hook添加了xid参数,这似乎与我的case关系不大,麻烦再提点一下

通过xid区分不同的hook,就不会因为事务嵌套,导致前者的hook被调用 如果你不是事务嵌套,尝试升级下版本,或者查看release note看看该问题是否已经被修复

0x9bb1 commented 1 month ago

4555

恕我愚钝...这是为hook添加了xid参数,这似乎与我的case关系不大,麻烦再提点一下

通过xid区分不同的hook,就不会因为事务嵌套,导致前者的hook被调用 如果你不是事务嵌套,尝试升级下版本,或者查看release note看看该问题是否已经被修复

我不是嵌套,我是tomcat线程复用导致前一事务设置的hook,被后一事务回滚后触发了。我去看看release note

0x9bb1 commented 1 month ago

我在release note中没有发现有提到该问题的 再补充一些细节,我的case不存在事务嵌套。是同一线程的不同时刻前者事务提交后,不知道为什么hook没有清理,导致下一个事务回滚的时候,将上一个事务放置的hook执行了。 而且本地debug也没有复现,所以没法提供一下最小可复现的case,但是我可以确认存在这种情况 看代码io.seata.spring.annotation.GlobalTransactionalInterceptor#handleGlobalTransaction的finally中确实clear了不知道为什么 后面有遇到相同case的小伙伴麻烦圈一下我

funky-eyes commented 1 month ago

我在release note中没有发现有提到该问题的 再补充一些细节,我的case不存在事务嵌套。是同一线程的不同时刻前者事务提交后,不知道为什么hook没有清理,导致下一个事务回滚的时候,将上一个事务放置的hook执行了。 而且本地debug也没有复现,所以没法提供一下最小可复现的case,但是我可以确认存在这种情况 看代码io.seata.spring.annotation.GlobalTransactionalInterceptor#handleGlobalTransaction的finally中确实clear了不知道为什么 后面有遇到相同case的小伙伴麻烦圈一下我

可以先尝试升级下看看

0x9bb1 commented 1 month ago

我在release note中没有发现有提到该问题的 再补充一些细节,我的case不存在事务嵌套。是同一线程的不同时刻前者事务提交后,不知道为什么hook没有清理,导致下一个事务回滚的时候,将上一个事务放置的hook执行了。 而且本地debug也没有复现,所以没法提供一下最小可复现的case,但是我可以确认存在这种情况 看代码io.seata.spring.annotation.GlobalTransactionalInterceptor#handleGlobalTransaction的finally中确实clear了不知道为什么 后面有遇到相同case的小伙伴麻烦圈一下我

可以先尝试升级下看看

好的 我这先先升级后观察观察

slievrly commented 3 weeks ago

I have always had a different opinion on this design. I think that the hook should not be thread-local but rather at the method granularity.