SAVEPOINT — 在当前事务中定义一个新的保存点
SAVEPOINT savepoint_name
SAVEPOINT 在当前事务中建立一个新的保存点。
保存点是事务内部的一个特殊标记,它允许把建立它之后执行的所有命令回滚,从而将事务状态恢复到该保存点建立时的状态。
savepoint_name要赋予新保存点的名称。如果已经存在同名保存点,那么在较新的同名保存点被释放之前,它们将不可访问。
使用 ROLLBACK TO 来回滚到一个保存点。使用 RELEASE SAVEPOINT 来销毁一个保存点,同时保留建立它之后所执行命令的效果。
只有在事务块内才能建立保存点。一个事务内可以定义多个保存点。
建立一个保存点,然后撤销建立它之后执行的所有命令的效果:
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
上述事务将插入值 1 和 3,但不会插入 2。
建立并随后销毁一个保存点:
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 my_savepoint;
INSERT INTO table1 VALUES (2);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
-- rollback to the second savepoint
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- shows rows 1 and 2
-- release the second savepoint
RELEASE SAVEPOINT my_savepoint;
-- rollback to the first savepoint
ROLLBACK TO SAVEPOINT my_savepoint;
SELECT * FROM table1; -- shows only row 1
COMMIT;
上述事务展示了值 3 先被回滚,随后是值 2。
SQL 要求当建立另一个同名保存点时,原来的保存点要被自动销毁。在 PostgreSQL 中,旧的保存点会被保留,但在回滚或释放时只会使用较新的那一个。(用 RELEASE SAVEPOINT 释放较新的保存点,会使较旧的保存点重新变得可以被 ROLLBACK TO SAVEPOINT 和 RELEASE SAVEPOINT 访问。)除此之外,SAVEPOINT 完全符合 SQL 标准。