UPDATE posts SET status=1 WHERE id=8821;
SELECT id, status FROM posts WHERE id=8821;

后台点了通过,列表状态变成已通过,前台文章页仍然显示「审核中」,刷新和清缓存都没用,数据库里状态还是 0。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,后台更新的是审核任务表,内容表的状态由另一个队列异步回写,队列消费失败没有重试。两边状态各存一份,天然容易不一致。

「审核状态未回写」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:把状态收敛到一张表,审核结果直接更新内容记录;必须异步时加失败重试和死信告警;补一条定时对账,扫描两张表状态不一致的记录。

改完只确认一件事:后台点通过后前台立刻显示已发布,两张表状态一致。

作者 9823189