在数据库中,Savepoint(保存点) 用于在一个事务(Transaction)内部设置“中间标记”,你可以之后回滚到某个保存点,而不是回滚整个事务。
下面从 概念 → 语法 → 示例 → 注意事项 给你讲清楚。
BEGIN TRANSACTION 之后使用ROLLBACK 的区别:
ROLLBACK:回滚整个事务ROLLBACK TO SAVEPOINT:回滚到指定点SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
RELEASE SAVEPOINT savepoint_name;
你在一个事务里:
BEGIN;
INSERT INTO users(id, name) VALUES (1, 'Tom');
SAVEPOINT sp_order;
INSERT INTO orders(id, user_id) VALUES (100, 1);
-- 假设这里出错了
-- ERROR
ROLLBACK TO SAVEPOINT sp_order;
-- 用户仍然存在,订单被回滚
COMMIT;
START TRANSACTION;
INSERT INTO users(id, name) VALUES (1, 'Tom');
SAVEPOINT sp_order;
INSERT INTO orders(id, user_id) VALUES (100, 1);
-- 发现问题
ROLLBACK TO SAVEPOINT sp_order;
COMMIT;
BEGIN;
INSERT INTO a VALUES (1);
SAVEPOINT s1;
INSERT INTO b VALUES (2);
SAVEPOINT s2;
INSERT INTO c VALUES (3);
ROLLBACK TO SAVEPOINT s1;
-- b 和 c 的操作都被撤销
COMMIT;
| 数据库 | 支持 Savepoint |
|---|---|
| PostgreSQL | ✅ |
| MySQL (InnoDB) | ✅ |
| Oracle | ✅ |
| SQL Server | ✅(语法略不同) |
| SQLite | ✅ |
如果你告诉我 具体用的数据库(MySQL / PostgreSQL / Oracle 等),我可以给你更精确的写法或实战案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。