SAVEPOINT 语句

使用 SAVEPOINT 语句来声明在当前的 SQL 事务之内新的保存点的名称,并设置在该事务之内 SQL 语句的词典顺序之内的新保存点的位置。SAVEPOINT 语句符合 SQL 的 ANSI/ISO 标准。

语法

元素 描述 限制 语法
savepoint 在此为新的保存点声明的名称 不可为在相同的保存点级别中现有的唯一保存点的名称 标识符

用法

您可在 SQL 事务中使用 SAVEPOINT 语句以 DB-Access 和 SPL、C 和 Java™ 例程来支持错误处理。您可定义保存点来将单个复杂的事务分隔成它的组件 SQL 语句的较小的逻辑子集。在那个事务之内,可更有效地回滚跟在每一保存点之后的语句的子集,比起如果您在多个事务中已使用了多个 COMMIT WORK 和 ROLLBACK WORK 语句的话。

SAVEPOINT 语句在当前的事务之内按照语句的词典顺序在当前的位置设置指定的保存点。在 SAVEPOINT 语句执行成功之后,引用此保存点的后续的 ROLLBACK TO SAVEPOINT 语句可取消对数据库任何未提交的更改,这些更改是跟在新的保存点之后但在 ROLLBACK TO SAVEPOINT 语句之前的。

如果在同一事务内的现有的保存点与 SAVEPOINT 语句指定的名称相同,则销毁现有的保存点,除非下列条件之一为真:
  • 在不同的保存点级别设置了现有的保存点。
  • 以 UNIQUE 关键字选项声明了现有的保存点名称。在此情况下 SAVEPOINT 语句失败并报错,除非在不同的保存点级别设置了现有的 UNIQUE 保存点。

销毁一保存点来为另一保存点重用它的名称,与释放该保存点不同。重用保存点名称仅销毁一个保存点。以 RELEASE SAVEPOINT 语句释放保存点会释放指定的保存点以及后续已设置了的所有保存点。

UNIQUE 选项

此可选的关键字指定应用程序不要打算在另一 SAVEPOINT 语句中重用此保存点的名称,在此保存点在当前的保存点级别之内是活动的时候。

如果保存点已存在,是在当前的保存点界别之内以相同的名称和以 UNIQUE 关键字设置了的,则 SAVEPOINT 语句失败并报错,且不销毁现有的保存点。

保存点级别

GBase 8s 支持构造嵌套的保存点级别。单个 SQL 事务可有多个保存点级别。在执行 SPL 例程或外部 UDR 期间,自动地创建新的保存点级别。递归地调用相同的 SPL 例程或 UDR 还增长当前事务的保存点级别。

当在其被创建的 UDR 中完成执行时,保存点级别终止。当保存点级别终止时,自动地释放在它之内的所有保存点。父保存点级别继承任何 DDL 或 DML 修改(即,到在其内创建了刚刚终止的那个保存点级别),并受任何针对该父保存点级别发出的保存点相关的语句支配。

下列规则适用于保存点级别之内的活动:
  • 仅可在保存点被创建的那个保存点级别之内引用保存点。您不可释放、销毁或回滚到在当前保存点级别之外创建的保存点。
  • 保存点名称的唯一性仅在当前的保存点级别之内是强制的。在其他保存点级别中为活动的保存点的名称可在当前的保存点级别中重用,而不影响其他保存点级别中的那些保存点。

在分布式 SQL 事务中的保存点

如果所有参与的数据库支持事务日志记录,则保存点在支持事务的单个 GBase 8s 实例的跨数据库分布式 SQL 事务中是有效的。在跨数据库 SQL 事务中还支持保存点,包括在高可用性集群中的操作,如果所有参与的 GBase 8s 实例支持保存点,且在该事务中访问的所有数据库都使用日志记录的话。

然而,如果在跨数据库事务中的任何参与的数据库服务器不支持保存点,且在可支持保存点的协调者与不支持保存点的从属服务器之间建立了连接,则在分布式会话之内的任何 ROLLBACK TO SAVEPOINT 语句都失败并报错。

保存点的保持

保存点是 SQL 事务之内,而不是数据库对象之内的位置标记。在同一事务之内,任何下列事件之一都销毁现有的保存点 S
  • 执行 COMMIT WORK 或 ROLLBACK WORK(无 TO SAVEPOINT 子句)语句。
  • 执行在同一保存点级别中指定 S 的 RELEASE SAVEPOINT 语句。
  • 执行 ROLLBACK TO SAVEPOINT 或 RELEASE SAVEPOINT 语句,指定早于在同一保存点级别中的 S 建立了的保存点。
  • 在同一保存级别中 SAVEPOINT 语句指定相同的名称作为 S,且 S 不是以 UNIQUE 关键字创建的。

对保存点的限制

在下列上下文中不支持保存点和保存点级别:
  • 在不支持事务日志记录的数据库中
  • 在触发器活动中
  • 在 XA 全局事务中
  • 在启用 AUTOCOMMIT 连接属性的应用程序或 UDR 中。

此外,在 DML 语句之内调用的 UDR 中,SAVEPOINT 语句(如 RELEASE SAVEPOINT 和 ROLLBACK WORK TO SAVEPOINT 语句)是无效的,如下例所示:

SELECT first_1 foo() FROM systables;

在此,foo( ) 例程不可设置保存点。

相关的语句

相关的语句:COMMIT WORK 语句RELEASE SAVEPOINT 语句ROLLBACK WORK 语句

1 GBase 8s 扩展