使用 SAVEPOINT 语句来声明在当前的 SQL 事务之内新的保存点的名称,并设置在该事务之内 SQL 语句的词典顺序之内的新保存点的位置。SAVEPOINT 语句符合 SQL 的 ANSI/ISO 标准。
您可在 SQL 事务中使用 SAVEPOINT 语句以 DB-Access 和 SPL、C 和 Java™ 例程来支持错误处理。您可定义保存点来将单个复杂的事务分隔成它的组件 SQL 语句的较小的逻辑子集。在那个事务之内,可更有效地回滚跟在每一保存点之后的语句的子集,比起如果您在多个事务中已使用了多个 COMMIT WORK 和 ROLLBACK WORK 语句的话。
SAVEPOINT 语句在当前的事务之内按照语句的词典顺序在当前的位置设置指定的保存点。在 SAVEPOINT 语句执行成功之后,引用此保存点的后续的 ROLLBACK TO SAVEPOINT 语句可取消对数据库任何未提交的更改,这些更改是跟在新的保存点之后但在 ROLLBACK TO SAVEPOINT 语句之前的。
销毁一保存点来为另一保存点重用它的名称,与释放该保存点不同。重用保存点名称仅销毁一个保存点。以 RELEASE SAVEPOINT 语句释放保存点会释放指定的保存点以及后续已设置了的所有保存点。
此可选的关键字指定应用程序不要打算在另一 SAVEPOINT 语句中重用此保存点的名称,在此保存点在当前的保存点级别之内是活动的时候。
如果保存点已存在,是在当前的保存点界别之内以相同的名称和以 UNIQUE 关键字设置了的,则 SAVEPOINT 语句失败并报错,且不销毁现有的保存点。
GBase 8s 支持构造嵌套的保存点级别。单个 SQL 事务可有多个保存点级别。在执行 SPL 例程或外部 UDR 期间,自动地创建新的保存点级别。递归地调用相同的 SPL 例程或 UDR 还增长当前事务的保存点级别。
当在其被创建的 UDR 中完成执行时,保存点级别终止。当保存点级别终止时,自动地释放在它之内的所有保存点。父保存点级别继承任何 DDL 或 DML 修改(即,到在其内创建了刚刚终止的那个保存点级别),并受任何针对该父保存点级别发出的保存点相关的语句支配。
如果所有参与的数据库支持事务日志记录,则保存点在支持事务的单个 GBase 8s 实例的跨数据库分布式 SQL 事务中是有效的。在跨数据库 SQL 事务中还支持保存点,包括在高可用性集群中的操作,如果所有参与的 GBase 8s 实例支持保存点,且在该事务中访问的所有数据库都使用日志记录的话。
然而,如果在跨数据库事务中的任何参与的数据库服务器不支持保存点,且在可支持保存点的协调者与不支持保存点的从属服务器之间建立了连接,则在分布式会话之内的任何 ROLLBACK TO SAVEPOINT 语句都失败并报错。
此外,在 DML 语句之内调用的 UDR 中,SAVEPOINT 语句(如 RELEASE SAVEPOINT 和 ROLLBACK WORK TO SAVEPOINT 语句)是无效的,如下例所示:
SELECT first_1 foo() FROM systables;
在此,foo( ) 例程不可设置保存点。
相关的语句:COMMIT WORK 语句、RELEASE SAVEPOINT 语句 和 ROLLBACK WORK 语句