SAVEPOINT 语句

SAVEPOINT 语句用于在事务中设置保存点。

调用

此语句可以嵌入在应用程序(包括过程)中,也可以通过交互方式发出此语句。 它是可动态准备的可执行语句。

授权

不需要执行任何操作。

语法

Read syntax diagramSkip visual syntax diagramSAVEPOINTsavepoint-nameUNIQUEON ROLLBACK RETAIN CURSORSON ROLLBACK RETAIN LOCKS

描述

savepoint-name
指定保存点的名称。 指定的 savepoint-name 不能以“SYS”开头 (SQLSTATE 42939)。 如果具有此名称的保存点已在此保存点级别中定义为 UNIQUE,那么将返回错误 (SQLSTATE 3B501)。
UNIQUE
指定当保存点在当前保存点级别中处于活动状态时,应用程序不打算复用此保存点名称。 如果 savepoint-name 已存在于此保存点级别中,那么将返回错误 (SQLSTATE 3B501)。
ON ROLLBACK RETAIN CURSORS
对于在 SAVEPOINT 语句之后处理的打开游标语句,指定回滚到此保存点时的系统行为。 该子句表明,如果有可能,游标可以不受“回滚到保存点”操作的影响。 有关游标受“回滚到保存点”操作影响的情况,请参阅 ROLLBACK
ON ROLLBACK RETAIN LOCKS
对于设置保存点后获取的锁定,指定回滚到此保存点时的系统行为。 将不跟踪自保存点以来获取的锁定,并且不会在回滚到保存点时回滚(释放)这些锁定。

规则

  • 不得在触发器定义中使用与保存点相关的语句 (SQLSTATE 42987)。
  • 当发生以下事件之一时,将启动新的保存点级别:
    • 将启动新的工作单元 (UOW)。
    • 将调用使用 NEW SAVEPOINT LEVEL 子句定义的过程。
    • 将启动原子复合 SQL 语句。
  • 当完成或移除导致创建保存点级别的事件时,将会终止该保存点级别。 当保存点级别终止时,将释放其中包含的所有保存点。 任何打开游标操作、DDL 操作或数据修改操作都由父保存点级别(即创建刚刚结束的保存点级别)继承,并受针对父保存点级别发出的任何保存点相关语句的影响。
  • 以下规则适用于保存点级别内的操作:
    • 只能在建立保存点的保存点级别内引用这些保存点。 您不能释放、销毁或回滚到在当前保存点级别之外建立的保存点。
    • 当保存点级别终止时,将自动释放当前保存点级别内建立的所有活动保存点。
    • 仅在当前保存点级别内实施保存点名称的唯一性。 可以在当前保存点级别中复用其他保存点级别中的活动保存点的名称,而不会影响其他保存点级别中的保存点。

注意

  • 一旦发出 SAVEPOINT 语句,就不允许对昵称执行插入、更新或删除操作。
  • 如果省略 UNIQUE 子句,那么表明保存点级别内的其他保存点可以复用 savepoint-name。 如果保存点级别中已存在同名的保存点,那么将销毁现有保存点并在当前处理点处使用相同名称创建新的保存点。 新的保存点将被视为应用程序建立的最后一个保存点。 请注意,另一个保存点通过复用保存点名称来销毁保存点只会销毁该保存点,并且不会释放在被销毁的保存点之后建立的任何保存点。 只能通过 RELEASE SAVEPOINT 语句释放这些后续保存点,该语句将释放指定的保存点以及在指定保存点之后建立的所有保存点。
  • 如果指定了 UNIQUE 子句,那么只能在释放同名的现有保存点后复用 savepoint-name
  • 在保存点内,如果实用程序、SQL 语句或数据库命令在处理期间执行间歇性落实,那么将隐式释放该保存点。
  • 如果在保存点内回滚了 SET INTEGRITY 语句,那么动态准备的语句名称仍然有效,尽管可能会再次隐式准备该语句。
  • 如果已缓存插入操作(即,使用 INSERT BUF 选项预编译了应用程序),那么在发出 SAVEPOINT、ROLLBACK 或 RELEASE TO SAVEPOINT 语句时将刷新缓冲区。

示例

对嵌套保存点执行回滚操作。 首先,创建一个名为 DEPARTMENT 的表。 在启动 SAVEPOINT1 之前插入一行; 插入第二行并启动 SAVEPOINT2;然后插入第三行并启动 SAVEPOINT3。
   CREATE TABLE DEPARTMENT (
     DEPTNO   CHAR(6),
     DEPTNAME VARCHAR(20),
     MGRNO    INTEGER)

     INSERT INTO DEPARTMENT VALUES ('A20', 'MARKETING', 301)

     SAVEPOINT SAVEPOINT1 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('B30', 'FINANCE', 520)

     SAVEPOINT SAVEPOINT2 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('C40', 'IT SUPPORT', 430)

     SAVEPOINT SAVEPOINT3 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('R50', 'RESEARCH', 150)
此时,存在包含行 A20、B30、C40 和 R50 的 DEPARTMENT 表。 如果您现在发出:
   ROLLBACK TO SAVEPOINT SAVEPOINT3
行 R50 不再位于 DEPARTMENT 表中。 如果您随后发出:
   ROLLBACK TO SAVEPOINT SAVEPOINT1
DEPARTMENT 表仍然存在,但自 SAVEPOINT1 建立以来插入的行(B30 和 C40)不再位于该表中。