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 允许省略它。
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。