生产端本地事务已经提交,broker 侧消息状态还是 UNKNOWN,回查接口每分钟被调一次,日志里 executeLocalTransaction 的返回值全是 null。日志里能对上时间点,这种反而好排。

本地事务执行成功但返回前抛了序列化异常,执行器既没拿到 COMMIT 也没拿到 ROLLBACK,broker 只能进入回查。回查实现按订单号查业务库,订单落在另一个数据源,查不到就继续 UNKNOWN。这一点先确认清楚,后面就不用反复试。

SELECT tx_id, status, retry_count FROM tx_local_log
WHERE order_no = '20260301008';
# 回查最多 15 次 超过后 broker 丢弃半消息

这次卡住的地方就在「事务消息回查」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:先确认 executeLocalTransaction 的返回值有没有被异常吞掉;回查改成查本地事务表 不要查业务库;回查三次还查不到就返回 ROLLBACK 别一直挂着;回查接口补日志 记下每次的 txId 和结果。

结果对不对很好判断,回查日志里能看到明确的 COMMIT 或 ROLLBACK broker 上不再有 UNKNOWN 状态的半消息。

作者 9823189