在数据库事务里,Savepoint(保存点)是可以“嵌套”使用的,但更准确地说,是在同一个事务中连续设置多个 Savepoint,从而形成一种类似嵌套/层级的效果。
你可以在一个事务中多次创建 Savepoint:
BEGIN;
INSERT INTO t VALUES (1);
SAVEPOINT sp1;
INSERT INTO t VALUES (2);
SAVEPOINT sp2;
INSERT INTO t VALUES (3);
SAVEPOINT sp3;
此时逻辑上形成:
事务开始
└─ sp1
└─ sp2
└─ sp3
你可以回滚到任意一个已存在的 Savepoint:
ROLLBACK TO sp2;
效果:
sp2 之后的操作(如插入 3)被撤销sp1、sp2 之前的操作仍然有效有些数据库(如 PostgreSQL、Oracle)支持:
RELEASE SAVEPOINT sp2;
表示:
sp2 这个保存点| 数据库 | 支持 Savepoint | 支持回滚到指定点 | 支持 RELEASE |
|---|---|---|---|
| MySQL (InnoDB) | ✅ | ✅ | ✅ |
| PostgreSQL | ✅ | ✅ | ✅ |
| Oracle | ✅ | ✅ | ✅ |
| SQL Server | ✅ | ✅ | ❌(用命名事务) |
COMMIT 或 ROLLBACK(不带 TO)整个事务,所有 Savepoint 失效✅ Savepoint 可以“嵌套式”使用
✅ 可以回滚到任意一层
✅ 常用于复杂事务中的部分回滚和错误恢复
如果你有具体数据库(MySQL / PG / Oracle 等),我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。