协调节点重启后 XA RECOVER 列出两个 xid,状态是 PREPARED,对应订单表的行锁一直没释放,下单接口开始报锁等待超时。日志里能对上时间点,这种反而好排。
prepare 阶段两个库都成功了,协调者在写提交日志前宕机。事务既没提交也没回滚,分支事务持着锁等协调者,协调者重启后没有重放日志。这一点先确认清楚,后面就不用反复试。
XA RECOVER; XA COMMIT 'xid-20260301-001'; XA ROLLBACK 'xid-20260301-002';
「XA PREPARED 悬挂」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:先用 XA RECOVER 确认有哪些悬挂的 xid;对照协调者日志判断应该提交还是回滚;确认后手工执行 XA COMMIT 或 XA ROLLBACK;协调者补提交日志落盘 重启后自动恢复。
结果对不对很好判断,执行完 XA RECOVER 列表为空 订单表上的行锁释放 下单接口不再报锁等待超时。
