Postgresql 中文操作指南
Description
RELEASE SAVEPOINT 释放指定的保存点,以及在这个指定保存点之后创建的所有活动保存点,并释放这些保存点的资源。从创建保存点到尚未撤销的所有更改都将合并到在创建指定保存点时处于活动状态的事务或保存点中。 RELEASE SAVEPOINT 之后进行的更改也将成为此活动事务或保存点的一部分。
Notes
指定尚未定义的保存点名称是一个错误。
当事务处于中止状态时,无法释放保存点;要执行此操作,请使用 ROLLBACK TO SAVEPOINT 。
如果多个保存点具有相同的名称,则仅释放最近定义的未释放保存点。重复执行的命令将释放越来越旧的保存点。
Examples
建立并稍后释放保存点:
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 并允许事务继续。