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 允许省略它。