SAVEPOINT用于在事务中设置一个保存点,即在当前事务内做一个特殊标记,允许在后续操作回滚(ROLLBACK TO)到指定保存点,将事务状态恢复到保存点时的状态。
建立保存点
设置好一个保存点,在后续操作中就可以把数据撤销到保存点时的状态,做到只回滚部分数据,方便按需回滚,需要在事务块内执行。
语法
SAVEPOINT savepoint_name
示例
-- create table
CREATE TABLE table1 (id integer);
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT sp1;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT sp1;
INSERT INTO table1 VALUES (3);
COMMIT;
上述示例中,回滚到SAVEPOINT的动作只会将INSERT INTO table1 VALUES (2);的结果回滚掉,不会影响其他写入。
回滚保存点
回滚保存点后执行的所有操作,回滚后,SAVEPOINT仍然有效,可以在需要时继续回滚。
语法
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
示例
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT sp1;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT sp1;
INSERT INTO table1 VALUES (3);
ROLLBACK TO SAVEPOINT sp1;
COMMIT;
上述示例中,发生了两次ROLLBACK TO sp1,最终事务提交后只有INSERT INTO table1 VALUES (1);操作被提交。
释放保存点
释放指定的保存点,并会同时释放后续创建的所有保存点。
语法
RELEASE SAVEPOINT savepoint_name
示例
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT my_savepoint;
ROLLBACK;
释放保存点主要用于释放事务资源,并不会将事务提交,例如上述示例中,INSERT插入的数据会跟随最后主事务的回滚操作而被撤销。