标准答案

  1. 先写只读 SELECT 验证筛选条件、受影响行数和样本,必要时由业务方确认目标范围。
  2. 修复语句应带明确主键范围、当前状态和版本条件,重复执行不应再次改变已修复记录。
  3. 大批量修复按小批次执行,控制事务大小、速率和观察窗口,避免长事务、复制延迟与锁积压。
  4. 记录操作者、工单、脚本版本、输入参数、每批结果和异常,便于审计与重放。
  5. 提前准备回滚数据、反向操作或可重建来源,并在执行后验证业务不变量和相关下游。

题目解析

直接在线 UPDATE 的危险在于范围和可逆性。一个少写租户条件的脚本可能修改全表;一个错误表达式可能立刻覆盖原值;一个大事务还会阻塞正常业务,让排查和回滚更难。

幂等不等于永远不改。它要求同一脚本在同一目标上重复运行后结果稳定。通常通过旧状态、版本号、迁移标识或修复记录保证,而不是只依赖“应该只执行一次”。

代码示例

先预览并按批次、旧状态和审计条件修复,受影响行数应与预期对账。

sql
-- 预览:确认范围和样本
SELECT id, status
FROM orders
WHERE tenant_id = ? AND status = 'stuck'
ORDER BY id
LIMIT 100;

-- 批次修复:仅修改仍处于目标旧状态的记录
UPDATE orders
SET status = 'cancelled', updated_at = CURRENT_TIMESTAMP
WHERE tenant_id = ?
  AND id > ? AND id <= ?
  AND status = 'stuck';

常见误区

  • 没有预览和行数上限,直接运行全表 UPDATE 后才发现条件写错。
  • 只记录“脚本执行成功”,没有保留受影响 ID、版本和回滚依据。

作者信息