首页/数据/SQL 速查/SAVEPOINT 部分回滚
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

SAVEPOINT 部分回滚

事务内设置保存点,出错时只回滚到某个点而不是整个事务:批量处理中“跳过坏行、保留好行”的常用手段。

SQL 速查数据更新于 2026-10-12

示例

示例
START TRANSACTION;
INSERT INTO t (id) VALUES (1);
SAVEPOINT sp1;
INSERT INTO t (id) VALUES (2);
ROLLBACK TO SAVEPOINT sp1;   -- 只撤销 id=2 的插入
RELEASE SAVEPOINT sp1;       -- 释放(可选,COMMIT 时自动清理)
COMMIT;                      -- id=1 生效
粒度保存点之间可嵌套;同名保存点会覆盖旧点(MySQL 行为)
典型场景批量导入:坏数据回滚到保存点后继续下一批
释放RELEASE SAVEPOINT 只是删除标记,不影响已执行的数据

易错点

  • ROLLBACK TO SAVEPOINT 之后再 COMMIT:保存点之前的修改仍然会提交,别误以为整段都撤销了
  • 重复使用同名保存点会隐式替换旧保存点(MySQL),循环里建保存点要保证命名清晰

数据来源与参考

  • MySQL 8.0 Reference Manual · SAVEPOINT
  • PostgreSQL Documentation · SAVEPOINT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌