9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

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))); -- 产生一个错误

在这个示例中,应用程序请求释放保存点sp2,它插入了3。 这会将插入操作的事务上下文更改为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