SAVEPOINT 分阶段回滚要点
- SAVEPOINT 名字 在事务内打个标记点
- ROLLBACK TO 名字 撤回到该点,其后的改动消失
- 一个事务里可以设多个保存点,分层回退
- RELEASE SAVEPOINT 名字 删除某个不再需要的标记
- 保存点只影响回滚位置,不结束事务本身
- 适合「批量步骤中某步失败但前面要保留」的场景
SAVEPOINT 分阶段回滚示例
START TRANSACTION;
INSERT INTO order_record (user_id, amount) VALUES (1, 100);
SAVEPOINT sp_after_order;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- 余额不足,只撤掉扣款,保留订单插入
ROLLBACK TO sp_after_order;
RELEASE SAVEPOINT sp_after_order;
COMMIT;
避坑提醒:长事务里多打几个 SAVEPOINT,就像游戏存档,哪步翻车就退到哪步,不必从头再来。