Skip to content

XA 模式一个分支超时,会把IDLE 连接放回连接池,导致其他业务执行异常 #6492

@tanyaofei

Description

@tanyaofei
  • I have searched the issues of this repository and believe that this is not a duplicate.

Ⅰ. Issue Description

开启 XA 全局事务后,如果其中一条 SQL 执行超时,会导致该分支回滚失败,并且以 IDLE 的状态放回连接池,后续再执行 SQL 会报错。

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

  1. 开启全局事务
  2. 执行分支事务 A,对记录 a 修改
  3. 执行分支事务 B,同样对记录 a 进行修改,但是由于 A 事务未完成,死锁导致阻塞。
  4. TC 检测到全局事务超时,让各分支事务回滚:事务 A 回滚成功,事务 B 由于还在执行中,回滚失败(不断刷回滚失败日志: NO_TA 错误,因为 B 事务还没 XA prepare
  5. 由于事务 A 已回滚,事务 B 继续执行,然后尝试 commit,先 XA end 再向 TC 查询状态,由于分布式事务已经没了,报错
  6. 报错之后尝试 rollback,rollback 时再次执行 XA end,mysql 返回错误 XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state,回滚失败
  7. 至此,当前连接处于 IDLE 状态,没有 XA rollback 成功

根本问题时因为 commit 的时候已经 XA end 过一次了,rollback 的时候又想 XA end 一次,中断了 rollback 过程。

Ⅴ. Anything else we need to know?

建议方案:

  1. 执行完 sql 后,commit 之前先向 TC 确认一次事务状态,如果事务已经过期了,直接执行 rollback
  2. rollback 时执行 XA end 之后如果 sql 报错是 IDLE 错误,忽略该错误继续 XA rollback

如果认定这是一个 bug,我可以尝试提交修改的 PR 😀

Ⅵ. Environment:

  • JDK version(e.g. java -version): 11
  • Seata client/server version: 1.8.0
  • Database version: 8.0.29

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions