后台看到 47 笔订单状态是 closed,对应商品的 locked_stock 加起来 83 件,可售库存一直是 0。定时任务日志每天都打印执行成功,看不出异常。乍看像缓存或者权限的锅,追下去往往不是。

UPDATE wp_sku s JOIN wp_order_item i ON i.sku_id = s.id
SET s.locked_stock = GREATEST(s.locked_stock - i.qty, 0)
WHERE i.order_id IN (SELECT id FROM wp_orders WHERE status='closed');

追下去是这么回事:关闭订单的脚本只更新了订单状态,释放冻结库存那一步写在前端取消按钮的回调里,超时关闭不经过那个入口。任务本身没报错,监控一直显示正常。

「超时订单库存释放」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,在关闭订单的同一个事务里加一条库存释放,按订单明细把 locked_stock 减回去;释放前判断是否已释放,用 order_item 上的 released 标记或流水表去重;任务跑完打印本次关闭单数和释放件数,两个数字对不上就报警。

验收就看一点,手动关闭一笔待付款订单,locked_stock 立刻减少,可售库存回到原值。

作者 9823189