在数据库中,Savepoint(保存点)本质上是一个由用户自定义的标识符(名称),用于在事务中标记一个中间状态,以便后续可以“回滚到该保存点”而不是回滚整个事务。
下面按常见数据库说明如何命名 Savepoint。
SAVEPOINT savepoint_name;
回滚到保存点:
ROLLBACK TO SAVEPOINT savepoint_name;
释放保存点(可选):
RELEASE SAVEPOINT savepoint_name;
虽然不同数据库略有差异,但一般遵循以下规则:
_✅ 推荐示例:
SAVEPOINT sp1;
SAVEPOINT before_update;
SAVEPOINT ins_2024;
❌ 不推荐:
SAVEPOINT 1sp; -- 数字开头
SAVEPOINT sp one; -- 有空格
@ 变量方式)SAVEPOINT sp_before_update;
UPDATE emp SET salary = salary + 100 WHERE id = 1;
ROLLBACK TO sp_before_update;
BEGIN;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
ROLLBACK TO SAVEPOINT sp1;
START TRANSACTION;
SAVEPOINT sp1;
DELETE FROM orders WHERE id = 10;
ROLLBACK TO sp1;
BEGIN TRANSACTION;
SAVE TRANSACTION sp1;
UPDATE users SET active = 0;
ROLLBACK TRANSACTION sp1;
✅ 使用有意义的名称
sp_before_payment
sp_after_insert_order
sp_validate_data
✅ 避免重复名称(会覆盖之前的保存点)
✅ 在复杂事务中按步骤编号
sp_step1
sp_step2
❌ 以为 Savepoint 是自动命名的
✅ 实际必须由用户显式命名
❌ 认为回滚到 Savepoint 会结束事务
✅ 不会,事务仍然继续,直到 COMMIT 或 ROLLBACK
如果你有具体数据库(Oracle / MySQL / PostgreSQL 等)或使用场景(存储过程 / 应用代码),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。