对账批次 5000 条,第 3120 条遇到唯一键冲突整批中断,重跑时又从 id=1 开始,前面 3119 条重复处理,日志刷了 3000 多行。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,任务只记录批次整体状态,没有记录处理到哪一条。失败时事务回滚,游标也跟着没了。

「批量任务断点续跑」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

SELECT id, cursor, total, success
FROM batch_job WHERE id=88;
UPDATE batch_job SET cursor=3120, success=3119 WHERE id=88;

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,把批次拆成固定大小的页 每页单独提交事务;处理完一页就把游标和成功条数写进批次表;重跑时从游标处继续 已经成功的直接跳过;最后用总数和成功数对账 缺的条目单独列出来。

最后用这个标准收尾,模拟第 3120 条失败后重跑 只处理剩余 1880 条 最终 success 等于 total。

作者 9823189