-
Notifications
You must be signed in to change notification settings - Fork 8.9k
Description
- 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)
- 开启全局事务
- 执行分支事务 A,对记录 a 修改
- 执行分支事务 B,同样对记录 a 进行修改,但是由于 A 事务未完成,死锁导致阻塞。
- TC 检测到全局事务超时,让各分支事务回滚:事务 A 回滚成功,事务 B 由于还在执行中,回滚失败(不断刷回滚失败日志:
NO_TA错误,因为 B 事务还没XA prepare) - 由于事务 A 已回滚,事务 B 继续执行,然后尝试
commit,先XA end再向 TC 查询状态,由于分布式事务已经没了,报错 - 报错之后尝试
rollback,rollback 时再次执行XA end,mysql 返回错误XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state,回滚失败 - 至此,当前连接处于
IDLE状态,没有XA rollback成功
根本问题时因为 commit 的时候已经 XA end 过一次了,rollback 的时候又想 XA end 一次,中断了 rollback 过程。
Ⅴ. Anything else we need to know?
建议方案:
- 执行完 sql 后,commit 之前先向 TC 确认一次事务状态,如果事务已经过期了,直接执行 rollback
- 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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels