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