SAVEPOINT

最近更新时间: 2026-03-13 09:03:00

SAVEPOINT用于在事务中设置一个保存点,即在当前事务内做一个特殊标记,允许在后续操作回滚(ROLLBACK TO)到指定保存点,将事务状态恢复到保存点时的状态。

建立保存点

设置好一个保存点,在后续操作中就可以把数据撤销到保存点时的状态,做到只回滚部分数据,方便按需回滚,需要在事务块内执行。

语法

SAVEPOINT savepoint_name

示例

-- create table
CREATE TABLE table1 (id integer);
BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT sp1;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT sp1;
    INSERT INTO table1 VALUES (3);
COMMIT;

上述示例中,回滚到SAVEPOINT的动作只会将INSERT INTO table1 VALUES (2);的结果回滚掉,不会影响其他写入。

回滚保存点

回滚保存点后执行的所有操作,回滚后,SAVEPOINT仍然有效,可以在需要时继续回滚。

语法

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

示例

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT sp1;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT sp1;
    INSERT INTO table1 VALUES (3);
    ROLLBACK TO SAVEPOINT sp1;
COMMIT;

上述示例中,发生了两次ROLLBACK TO sp1,最终事务提交后只有INSERT INTO table1 VALUES (1);操作被提交。

释放保存点

释放指定的保存点,并会同时释放后续创建的所有保存点。

语法

RELEASE SAVEPOINT savepoint_name

示例

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
ROLLBACK;

释放保存点主要用于释放事务资源,并不会将事务提交,例如上述示例中,INSERT插入的数据会跟随最后主事务的回滚操作而被撤销。