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
在此示例中,应用程序请求释放保存点 sp2,该保存点插入了 3。这会将插入的事务上下文更改为 sp1。当尝试插入值 4 的语句生成错误时,值 2 和 4 的插入丢失,因为它们位于同一个已回滚的保存点中,而值 3 位于同一个事务上下文中。应用程序现在只能选择以下两个命令之一,因为所有其他命令都将被忽略
ROLLBACK; ROLLBACK TO SAVEPOINT sp1;
选择 ROLLBACK 将中止所有内容,包括值 1,而 ROLLBACK TO SAVEPOINT sp1 将保留值 1 并允许事务继续。
此命令符合SQL标准。标准规定关键字 SAVEPOINT 是强制性的,但 PostgreSQL 允许省略它。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。