可选的 TO SAVEPOINT 子句指定部分回滚。此子句可将回滚的范围限定到在 ROLLBACK 语句与指定的或缺省的保存点之间的当前保存点级别的操作。如果在 SAVEPOINT 关键字之后未指定 savepoint,则回滚终止在当前保存点级别之内的最近设置保存点。
当 ROLLBACK WORK TO SAVEPOINT 语句执行成功时,在保存点之前的 DDL 和 DML 语句的任何影响依然保持,但取消通过跟在保存点之后的语句对数据库的模式的更改或对其数据值的更改。这些取消了的语句所需要的任何锁依然保持,但在事务末尾被释放。销毁在指定的保存点与 ROLLBACK 语句之间的任何保存点,但通过 ROLLBACK 语句引用的保存点(以及在被引用的保存点之前的任何保存点)继续存在。程序控制传递到紧跟在 ROLLBACK 语句之后的语句。
如果省略 TO SAVEPOINT 子句,则 ROLLBACK 语句回滚整个事务,以及被释放的事务之内的所有保存点。
如果在当前的事务中指定的 savepoint 不存在,则数据库服务器发出例外。
在紧跟在 TRUNCATE 语句之后的 ROLLBACK 语句中,TO SAVEPOINT 子句是无效的。在此情况下,尝试进行的部分回滚失败并报错。要取消 TRUNCATE 语句已经对表造成的未提交的更改,请发出 ROLLBACK WORK 作为下一语句,但不带 TO SAVEPOINT 子句。
BEGIN WORK; DROP TABLE tab03; CREATE TABLE tab03 (col1 CHAR(24), col2 DATE); SAVEPOINT pt108; ... INSERT INTO tab03 VALUES ('First day of autumn', '09/23/2012'); SAVEPOINT pt109; ... DELETE FROM tab03 WHERE col2 < '12/09/2009'; SAVEPOINT pt110; ... ROLLBACK TO SAVEPOINT pt109;
相关的语句:BEGIN WORK 语句、COMMIT WORK 语句、RELEASE SAVEPOINT 语句 和 SAVEPOINT 语句。
要了解对事务和 ROLLBACK WORK 的讨论,请参阅 GBase 8s SQL 教程指南。