COMMIT 语句

COMMIT语句结束执行它的恢复单元,并为进程启动新的恢复单元。 该语句将SQL模式语句和SQL数据更改语句在工作单元期间所做的所有更改都记录下来。

调用 COMMIT

此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。 它不能用于 IMS 或 CICS® 环境。

授权 COMMIT

不需要执行任何操作。

语法 COMMIT

阅读语法图跳过可视化语法图COMMITWORK

描述 COMMIT

COMMIT语句结束执行它的恢复单元,并为进程启动新的恢复单元。 该语句将SQL模式语句和SQL数据更改语句在工作单元期间所做的所有更改都记录下来。 更多信息请参阅 Db2 for z/OS 中的 SQL 语句

备注 COMMIT

建议的编码实践

在应用程序进程结束时编写明确的 COMMIT 或 ROLLBACK 语句。 根据应用程序环境,在应用程序进程结束时,将执行隐式提交或回滚操作。 因此,在允许显式提交或回滚的环境中,便携式应用程序应在执行结束前明确执行提交或回滚语句。

COMMIT 的效果

恢复单元内设置的所有保存点都会释放,恢复单元内执行的以下语句的所有更改都会提交:

  • ALTER
  • COMMENT
  • 创建
  • 删除
  • DROP
  • EXPLAIN
  • GRANT
  • INSERT
  • 标签
  • MERGE
  • RENAME
  • REVOKE
  • UPDATE
  • 使用SQL数据更改语句进行SELECT INTO操作
  • 带有SQL数据更改语句的子选择

当出现以下任一情况时,SQL连接将被终止:

  • 连接处于等待发布状态
  • 连接状态不是“等待发布”,而是远程连接,并且:
    • 断开(自动)绑定选项已启用,或
    • DISCONNECT(CONDITIONAL)绑定选项生效,且打开的WITH HOLD光标与连接不相关。

对于现有连接,所有LOB定位器均被取消关联,但已发布HOLD LOCATOR语句且未发布相应FREE LOCATOR语句的定位器除外。 所有未使用 WITH HOLD 选项声明的打开光标都将被关闭。 所有使用 WITH HOLD 选项声明的打开游标以及为这些游标准备的 SELECT 语句都将被保留。

引用已声明的全局临时表的静态和动态INSERT、UPDATE、DELETE和MERGE语句,如果定义时未使用ON COMMIT DROP TABLE,且绑定或使用RELEASE(DEALLOCATE)选项,则这些语句将保留到提交点之后。 如果满足以下条件之一,则提交点不会保留该语句:

  • 已声明的全局临时表使用ON COMMIT DROP TABLE选项定义。
  • 该语句使用RELEASE(COMMIT)绑定选项。
  • 该语句还引用了 Db2 基本对象(例如表或视图),且以下语句之一为真:
    • 基本对象引用用于 Db2 目录表。
    • 在提交点, Db2 确定另一个 Db2 线程正在等待基础对象数据库描述符(DBD)上的X-lock。
    • 该语句引用了XML函数或操作,在提交点 Db2 确定必须释放XML操作的基础对象DBD S-lock。
    • 在提交点, Db2 确定语句使用的基对象DBD S-lock必须被释放,且不能在提交点之间保持。
  • Db2 确定另一个 线程正在等待包含该语句的 包的X-lock。 Db2 Db2

如果满足以下条件之一,则准备好的动态语句将保留在提交点之后:

  • 您的系统已启用动态缓存。 在这种情况下,所有与 KEEPDYNAMIC(YES) 绑定且已准备好的 SELECT 和数据更改语句都会保留到提交点之后。
  • 语句引用了一个声明的全球临时表,该表定义时未使用ON COMMIT DROP TABLE,并且包绑定或使用了RELEASE(DEALLOCATE)选项。 在这种情况下,所有已准备好的INSERT、UPDATE、DELETE和MERGE语句都会引用已声明的全局临时表,并保留在提交点中。

如果满足以下条件之一,则准备好的语句无法保留到提交之后:

  • 该网站已发布SQL版本。
  • 使用了断开(自动)选项。
  • 使用了绑定选项“断开(条件)”,且该站点没有打开的“保持”光标。
  • 该语句引用了一个已声明的全局临时表,没有打开的 WITH HOLD 游标,并且位于一个使用 RELEASE(COMMIT) 选项绑定的包中。
  • 该语句引用了一个已声明的全球临时表,该表使用ON COMMIT DROP TABLE选项定义。 该语句也没有打开的 WITH HOLD 光标,并且该语句的包绑定或使用了 RELEASE(DEALLOCATE) 选项。

所有隐式获取的锁都会释放,但以下锁除外:

  • 游标未关闭所需的锁
  • 当绑定命令中的“释放”参数不是“释放(提交)”时,表和表空间锁定
  • LOB锁定装置和LOB桌面空间锁定装置,用于锁定LOB定位器

关于明确获取的锁的持续时间的说明,请参阅 Db2 for z/OS 中的锁持续时间和释放行为

应用程序进程中创建的临时表的所有行都会被删除,但以下情况除外:如果应用程序进程中的任何程序有一个依赖于该表的打开的WITH HOLD游标,则该临时表的行不会被删除。 此外,如果RELEASE(COMMIT)生效,则行已被删除的已创建临时表的逻辑工作文件也会被删除。

应用程序进程的每个已声明临时表的所有行都会被删除,但以下情况除外:

  • 使用ON COMMIT PRESERVE ROWS属性定义的临时表中的行不会被删除。
  • 如果应用程序进程中的任何程序具有依赖于该表的打开的WITH HOLD游标,则不会删除使用ON COMMIT DELETE ROWS属性定义的已声明临时表的行。
隐式提交操作
在所有 Db2 环境中,进程的正常终止都是隐式提交操作。
COMMIT 的使用限制
COMMIT 语句不能在 IMS 或 CICS 环境中使用。 在这些环境中,要执行提交操作,SQL程序必须使用事务管理器规定的调用。 这些提交操作对 Db2 数据的影响与 SQL COMMIT 语句相同。

如果存储过程位于用户定义函数或触发器的调用链中,或者 Db2 不是提交协调器,则COMMIT语句不能用于该存储过程。

提交对特殊寄存器的影响
发出 COMMIT 语句可能会导致重新初始化特殊寄存器。 这些特殊寄存器是否受提交的影响取决于在应用程序流程中是否明确设置了特殊寄存器。 例如,假设在应用程序进程中,未使用 SET PATH 语句明确设置 PATH 特殊寄存器。 提交后,PATH的值将被重新初始化。 有关 PATH 初始化的信息,可参考 CURRENT SQLID 的当前值,请参见 CURRENT PATH 特殊寄存器
提交对全局变量的影响

全局变量不受事务级别的控制,因此发出 COMMIT 语句一般不会影响全局变量的内容。

示例 COMMIT

恢复单元启动后,将所有 Db2 数据库更改提交。
  COMMIT WORK;