1.1ROLLBACK WORK 语句
使用 ROLLBACK WORK 语句来有意地取消当前事务的全部或部分,撤销从该事务开始以来发生的任何更改,或在该 ROLLBACK WORK 语句与指定的或缺省的保存点之间发生的任何更改。
语法
元素 描述 限制 语法
savepoint 定界回滚的范围的保存点的名称 必须在当前的事务中存在。 标识符
用法
ROLLBACK WORK 语句仅在支持事务日志记录的数据库中是有效的。仅可回滚日志记录了的操作。仅在多语句操作的结尾使用 ROLLBACK WORK。
ROLLBACK WORK 语句将数据库恢复到在该事务开始的被取消的部分之前已存在的状态。
在不符合 ANSI 的数据库中,BEGIN WORK 语句启动事务。您可以 COMMIT WORK 语句终止该事务,或以 ROLLBACK WORK 语句取消该事务的全部或部分。在不符合 ANSI 的数据库中,当没有事务正在挂起时,如果您发出 ROLLBACK WORK 语句,则 GBase 8s 发出错误。
在符合 ANSI 的数据库中,多语句事务是隐式的。您不需要以 BEGIN WORK 语句标记事务的起始。您仅需要以 COMMIT WORK 语句标记每一事务的结尾,或以 ROLLBACK WORK 语句取消该事务。当没有事务正在挂起时,如果您发出 ROLLBACK WORK 语句,则接受该语句但不起作用。
ROLLBACK WORK 语句将数据库恢复到在该事务开始的被取消的部分之前存在的状态。除非您包括 TO SAVEPOINT 关键字,不然,ROLLBACK WORK 取消整个事务。
ROLLBACK WORK 语句释放取消了的事务持有的所有行和表锁。
在 GBase 8s ESQL/C 和 SPL 中,ROLLBACK WORK 语句关闭所有打开的游标,除了那些通过包括 WITH HOLD 关键字被声明作为保持游标的游标。在提交或回滚事务之后,保持游标保持打开。
如果您在 WHENEVER 语句调用的 SPL 例程内部使用 ROLLBACK WORK 语句,则请在 ROLLBACK WORK 语句之前指定 WHENEVER SQLERROR CONTINUE 和 WHENEVER SQLWARNING CONTINUE。如果 ROLLBACK WORK 语句遇到错误或警告,则此步骤防止程序发生循环。
如果程序异常地终止,则隐式地回滚当前的事务。
WORK 关键字
WORK 关键字在 ROLLBACK WORK 语句中是可选的。下列两个语句是等价的:
ROLLBACK;
ROLLBACK WORK;
TO SAVEPOINT 子句
可选的 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 子句。
下列程序片断将当前的事务会滚到名为 pt109 的保存点:
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;
在此示例中的 ROLLBACK 语句有这些作用:
取消删除 col2 日期值早于 2009 年 12 月 9 日的任何行的 DML 操作。
释放保存点 pt110,以及在 pt109 与 ROLLBACK 语句之间的任何其他保存点。
取消当前事务之内按照 SQL 语句的词典顺序跟在保存点 pt109 之后的操作对数据库的任何其他更改。
然而,不释放保存点 pt108,因为在该事务中它被设置早于 pt109。未被此部分回滚取消的是,在设置了 pt109 保存点之前该事务的任何未提交的 DDL 或 DML 操作的影响,包括表 tab03 的创建以及向那个表添加行的 INSERT 操作。这些会在部分回滚之后依然保持,将另一部分回滚的可能性挂起到保存点,以及整个事务的最终提交或回滚。
相关的语句
相关的语句:BEGIN WORK 语句、COMMIT WORK 语句、RELEASE SAVEPOINT 语句 和 SAVEPOINT 语句。
要了解对事务和 ROLLBACK WORK 的讨论,请参阅 GBase 8s SQL 教程指南。



