温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库Savepoint保存点怎么用

发布时间:2026-11-05 02:13:45 来源:亿速云 阅读:101 作者:小樊 栏目:数据库

在数据库中,Savepoint(保存点) 用于在一个事务(Transaction)内部设置“中间标记”,你可以之后回滚到某个保存点,而不是回滚整个事务。

下面从 概念 → 语法 → 示例 → 注意事项 给你讲清楚。


一、Savepoint 是什么?

  • 通常在 BEGIN TRANSACTION 之后使用
  • 可以在事务中设置多个保存点
  • 回滚到保存点时:
    • 只撤销保存点之后的操作
    • 事务仍然继续存在
  • 和 ROLLBACK 的区别:
    • ROLLBACK:回滚整个事务
    • ROLLBACK TO SAVEPOINT:回滚到指定点

二、基本语法(以常见数据库为例)

1️⃣ 设置保存点

SAVEPOINT savepoint_name;

2️⃣ 回滚到保存点

ROLLBACK TO SAVEPOINT savepoint_name;

3️⃣ 释放保存点(可选)

RELEASE SAVEPOINT savepoint_name;

三、使用示例(以 PostgreSQL / MySQL 为主)

示例场景

你在一个事务里:

  1. 插入用户
  2. 插入订单(可能出错)
  3. 如果订单失败,只回滚订单,不回滚用户

PostgreSQL 示例

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;

MySQL 示例(InnoDB)

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;

四、多个 Savepoint 示例

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;

五、使用注意事项

✅ 适用场景

  • 复杂事务中局部回滚
  • 存储过程 / 函数内部
  • 批量操作中部分失败

❌ 不支持或限制

  • MyISAM(MySQL)不支持事务和保存点
  • 保存点只在当前事务中有效
  • 事务提交或回滚后,保存点自动失效

六、常见数据库支持情况

数据库 支持 Savepoint
PostgreSQL ✅
MySQL (InnoDB) ✅
Oracle ✅
SQL Server ✅(语法略不同)
SQLite ✅

如果你告诉我 具体用的数据库(MySQL / PostgreSQL / Oracle 等),我可以给你更精确的写法或实战案例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手