Skip to content

RELEASE SAVEPOINT

RELEASE SAVEPOINT — 释放先前定义的保存点

概要

RELEASE [ SAVEPOINT ] savepoint_name

描述

RELEASE SAVEPOINT释放命名的保存点和在该命名保存点后创建的所有活动保存点,并释放它们的资源。自创建保存点以来所做的所有更改(尚未回滚的更改)将合并到在创建命名保存点时处于活动状态的事务或保存点中。在RELEASE SAVEPOINT之后所做的更改也将成为此活动事务或保存点的一部分。

参数

savepoint_name

要释放的保存点的名称。

注释

指定之前未定义的保存点名称是一个错误。

当事务处于中止状态时,无法释放保存点;要执行此操作,请使用ROLLBACK TO SAVEPOINT

如果多个保存点具有相同的名称,则只释放最近定义的未释放保存点。重复的命令将释放逐渐较旧的保存点。

示例

建立并稍后释放一个保存点

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

上述事务将插入 3 和 4。

一个具有多个嵌套子事务的更复杂的示例

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT sp1;
    INSERT INTO table1 VALUES (2);
    SAVEPOINT sp2;
    INSERT INTO table1 VALUES (3);
    RELEASE SAVEPOINT sp2;
    INSERT INTO table1 VALUES (4))); -- generates an error

在此示例中,应用程序请求释放插入了 3 的保存点sp2。这将插入事务上下文更改为sp1。当尝试插入值 4 的语句生成错误时,2 和 4 的插入将丢失,因为它们处于相同(现在已回滚)的保存点中,而值 3 处于相同的事务上下文中。应用程序现在只能选择这两个命令之一,因为所有其他命令都将被忽略

ROLLBACK;
   ROLLBACK TO SAVEPOINT sp1;

选择ROLLBACK将中止所有内容,包括值 1,而ROLLBACK TO SAVEPOINT sp1将保留值 1 并允许事务继续。

兼容性

此命令符合SQL标准。该标准规定关键字SAVEPOINT是强制性的,但PostgreSQL允许省略它。

另请参阅

BEGIN,COMMIT,ROLLBACK,ROLLBACK TO SAVEPOINT,SAVEPOINT