必须用 BEGIN TRANSACTION TRY...CATCH 包裹UPDATE 带明确 WHERE 和主键/唯一约束校验分批处理如每500行按主键升序访问防死锁禁用逗号拼接参数优先用表变量或JSON避免DO块裸写。SQL Server 存储过程中怎么写批量 UPDATE 并确保不丢数据直接说结论必须用 BEGIN TRANSACTION TRY...CATCH 包裹且 UPDATE 语句本身要带明确的 WHERE 条件和主键/唯一约束校验。否则看似批量执行了实际可能漏更新、重复更新甚至把整张表锁死。常见错误现象UPDATE 没加 WHERE 导致全表覆盖事务没设超时长时间阻塞其他查询COMMIT 前没检查 ROWCOUNT误以为更新成功但其实一行都没改。使用场景比如定时同步订单状态、批量修正用户积分、导入 Excel 后补全关联字段参数差异传入的 batchIds 最好是 TABLE 类型变量或 JSON 字符串SQL Server 2016别用逗号拼接的字符串——容易被 SQL 注入也难做索引性能影响如果一次更新上万行别在一个事务里硬扛拆成每 500 行一批用 WHILE 循环 SET ROWCOUNT旧版或 OFFSET-FETCH 控制批次MySQL 存储过程里批量 UPDATE 为什么总卡住或报错 1205死锁根本原因不是语句写得不对而是多线程并发调用时不同会话按不同顺序访问同一组记录触发 InnoDB 行锁升级为间隙锁冲突。哪怕只是更新两行只要顺序不一致就可能死锁。实操建议所有批量更新必须按主键或唯一索引升序处理用 ORDER BY id 强制访问顺序一致避免在存储过程中嵌套调用其他写操作过程尤其不要在循环里反复 SELECT ... FOR UPDATE设置合理 innodb_lock_wait_timeout默认 50 秒并在应用层捕获 Deadlock found when trying to get lock 错误后重试示例中别用 UPDATE t SET x x 1 WHERE id IN (SELECT id FROM temp_batch) —— 这种写法在 MySQL 5.7 下会锁全表改用 JOIN 形式UPDATE t JOIN temp_batch b ON t.id b.id SET t.x t.x 1PostgreSQL 的 DO 块里做批量更新怎么避免事务自动提交失败PostgreSQL 不允许在普通函数或 DO 块里显式用 BEGIN/COMMIT除非定义成 TRANSFORM 或用 plpgsql 函数并设 SECURITY DEFINER。最稳妥的做法是把逻辑写进函数而不是裸写 DO 块。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能