ROLLBACK 语句
ROLLBACK语句可用于结束一个恢复单元,并撤销该恢复单元所做的所有关系数据库更改。 如果关系数据库是应用程序进程使用的唯一可恢复资源,则回滚也会结束工作单元。 ROLLBACK还可以用于仅撤销在恢复单元内设置保存点后所做的更改,而不会结束恢复单元。 返回保存点可以撤销选定的更改。
调用 ROLLBACK
此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。 只有在指定了“TO SAVEPOINT”条款的情况下,它才能用于 IMS 或 CICS® 环境。
授权 ROLLBACK
不需要执行任何操作。
语法 ROLLBACK
描述 ROLLBACK
当使用 ROLLBACK 时没有 SAVEPOINT 子句,则执行 ROLLBACK 语句的恢复单元将结束,并启动新的恢复单元。
在恢复单元期间,以下语句所做的所有更改都会撤销:
- ALTER
- COMMENT
- 创建
- 删除
- DROP
- EXPLAIN
- GRANT
- INSERT
- 标签
- MERGE
- REFRESH TABLE
- RENAME
- REVOKE
- 使用SQL数据更改语句进行SELECT INTO操作
- 带有SQL数据更改语句的select语句
- 当未指定 IMMEDIATE 子句时,TRUNCATE
- UPDATE
没有“保存点”条款的“回滚”也会导致以下操作:
- 在恢复单元中隐式获取的所有锁都会释放。 关于显式获取的锁的持续时间的说明,请参阅 LOCK TABLE 语句。
- 所有游标都关闭,所有准备好的语句都被销毁,与准备好的语句相关的游标都失效。
- 应用程序进程中创建的每个临时表的所有行和逻辑工作文件都会被删除。 (已声明的临时表的所有行都不会被隐式删除。 与基本表一样,在恢复单元期间对已声明的临时表所做的任何更改都会被撤消,以将表恢复到上一个提交点时的状态。)
- 所有LOB定位器,包括那些被占用的,都被释放。
- 至SAVEPOINT
- 指定恢复单位不会结束,只执行部分回滚(回滚到保存点)。 如果未指定保存点名称,则回滚到上一个活动保存点。 例如,如果在恢复单元中,保存点A、B和C按此顺序设置,然后释放C,则“回滚到保存点”会导致回滚到保存点B。
- savepoint-name
- 确定回滚的保存点。 名称必须标识当前服务器上存在的保存点。
在设置保存点后所做的所有数据库更改(包括对已声明临时表的更改,但不包括对已创建临时表的更改)都会被撤销。 对已创建的临时表所做的更改不会记录,也不会回退;而是会发出警告。 (当创建的临时表被修改且存在活动保存点时,也会发出警告。)
此外,以下项目均未撤销:
- 游标的打开或关闭
- 光标位置的变化
- 锁具的获取和释放
- 回滚语句的缓存
在执行回滚操作后设置的任何保存点都会被释放。 执行回滚操作的保存点不会被释放。
带有或不带有“保存点”条款的“回滚”对连接没有影响。
备注 ROLLBACK
以下信息仅适用于回滚恢复单元中的所有更改(不带 TO SAVEPOINT 子句的 ROLLBACK 语句):
- 存储过程。 如果该过程位于用户定义函数或触发器的调用链中,或者 Db2 不是提交协调器,则不能使用ROLLBACK语句。
- IMS 或。 CICS 在 IMS 或 CICS 环境中使用ROLLBACK TO SAVEPOINT语句只会回滚 Db2 资源。 环境中更新的任何其他可恢复资源都不会回滚。 在这些环境中,SQL程序必须使用事务管理器规定的调用,才能进行回滚操作。 这些回滚操作对 Db2 数据的影响与SQL ROLLBACK语句相同。
在 IMS 或 CICS 环境中,使用WITH hold选项关闭游标的操作与SQL ROLLBACK语句可能有所不同。 如果一个应用程序请求从 CICS 或 IMS 进行回滚操作,但自上次提交点以来, Db2 中没有任何工作,则回滚请求不会广播到 Db2。 如果应用程序在之前的工作单元中使用了“保持”选项打开了游标,则游标不会关闭,与这些游标关联的任何已准备语句也不会被破坏。
- 隐式回滚操作: 在所有 Db2 环境中,进程的异常结束是一个隐式的回滚操作。
未记录的 ROLLBACK 和非 LOB 表空间 :如果对一个工作单元执行 ROLLBACK,而该工作单元包含对未记录的非 LOB 表空间(指定了 NOT LOGGED 属性)的更改,则该表空间将被标记为 RECOVER-pending,并放入逻辑页面列表中。 因此,回滚操作完成后,表格空间将不可用。 有关 RECOVER 实用程序的更多信息,请参阅 RECOVER。
回滚和未记录的已声明全局临时表 :当在已声明的全局临时表上指定NOT LOGGED时,如果 Db2 由于重复键错误等错误而必须回滚,则根据为ON ROLLBACK指定的选项删除或保留行。
如果为表指定了“ON ROLLBACK DELETE ROWS”选项,则不会记录插入、更新和删除操作。 在回滚或回滚到保存点操作期间,如果自上次提交语句以来表已更新,则表中的所有行都会被删除。 表格中任何打开的游标都没有位置。 如果未提交已声明的全局临时表的声明,则该表的声明将被回滚。
如果为表指定了“回滚时保留行数”选项,则不会记录插入、更新和删除操作。 在回滚或回滚到保存点操作期间,表中的所有行都将被保留,而不管自上次提交语句以来对表进行了哪些更新。 表格中任何打开的游标都没有位置。 如果未提交已声明的全局临时表的声明,则该表的声明将被回滚。
ROLLBACK对全局变量的影响 :全局变量不受事务级控制。 发出ROLLBACK语句不会影响全局变量的内容。
回滚对插入操作的影响 :如果执行INSERT语句导致在表空间中创建数据集,并且INSERT操作被回滚,则插入的数据将被删除,但数据集不会被删除。
ROLLBACK对已准备好的动态语句的影响 :与KEEPDYNAMIC(YES)绑定在一起的程序包中的所有已准备好的动态语句都会保留在回滚点之后。
例子 ROLLBACK
ROLLBACK WORK;
...
SAVEPOINT A ON ROLLBACK RETAIN CURSORS;
...
SAVEPOINT B ON ROLLBACK RETAIN CURSORS;
...
SAVEPOINT C ON ROLLBACK RETAIN CURSORS;
...
RELEASE SAVEPOINT C;
...
仅将 Db2 数据库的所有更改回滚到保存点A: ROLLBACK WORK TO SAVEPOINT A;
如果未指定保存点名称(即 ROLLBACK WORK TO SAVEPOINT
),则回滚操作将恢复到上次设置的保存点,即B。