问题报告 纠错本页面

SAVEPOINT

名称

SAVEPOINT -- 在当前事务里定义一个新保存点

大纲

SAVEPOINT savepoint_name

描述

SAVEPOINT在当前事务里建立一个新的保存点。

保存点是事务中的一个特殊记号,它允许将那些在它建立后执行的命令全部回滚, 把事务的状态恢复到保存点所在的时刻。

参数

savepoint_name

赋予新保存点的名字。

注意

使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用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 。

兼容性

SQL 要求在另外一个同名保存点建立的时候自动删除前面那个同名保存点。 在PostgreSQL里,将保留旧的保存点,但是在回滚或者释放的时候, 只使用最近的那个。用RELEASE SAVEPOINT释放了新的保存点将导致旧的再次成为 ROLLBACK TO SAVEPOINTRELEASE SAVEPOINT可以访问的保存点。 否则,SAVEPOINT是完全符合 SQL 标准的。

又见

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, ROLLBACK TO SAVEPOINT