DB2 select 行隔离不起作用

DB2 select row isolation not working

通过这个 link 我应该能够 isolate 使用 select 语句读取的 rows 但是当我在下面的 运行步骤它不锁定行

  1. create table test ( col varchar(50));
  2. INSERT INTO test values('100');
  3. select COL from mdmsysdb.test WITH RS USE AND KEEP EXCLUSIVE LOCKS
    select COL from mdmsysdb.test WITH RR USE AND KEEP EXCLUSIVE LOCKS
  4. 在并行应用程序中,当我 运行 更新语句时它会正确执行。

当 select 被定义为持有独占锁时,为什么在第 4 步中从并行应用程序更新行,我的方法有什么问题?

如果您使用 RHEL 和 运行 shell 命令行(bash 或 ksh 等)上的 SQL 语句。那么您需要了解默认的自动提交行为。

注意为 Db2 服务器的 versionplatform 使用正确的 SQL 语法。这些在 Linux/Unix/Windows 和 i-Series 和 Z/OS 之间有所不同。每个平台的行为可能不同,每个平台的不同设置可以调整锁定行为。

Windows/Linux/Unix 上的 Db2 CLP 默认会自动提交。因此,当自动提交发生时,语句获取的任何锁都会在语句完成时立即释放。这解释了为什么(在不同的会话中)您不能强制等待锁定 - 锁定已经消失!

所以观察到的行为是正确的 - 按设计工作,而不是你错误地想象的那样。您可以通过有选择地禁用自动提交来更改默认行为。

要禁用自动提交,您有不同的选择。您可以在 CLP 的命令行上执行此操作以影响当前命令行(使用 +c 选项),或者您可以使用 DB2OPTIONS 环境变量为会话永久设置它(通常是个坏主意) ,或者您可以 enable/disable 通过 update command options using c off;update command options using c on; 命令在脚本中即时自动提交。

要在 Db2 CLP 的命令行上禁用自动提交,仅针对单个语句,然后使用 +c 选项,例如:

db2 +c "select COL from mdmsysdb.test WITH RS USE AND KEEP EXCLUSIVE LOCKS"

当您禁用自动提交时,您将负责执行显式提交或回滚。如果您使用了 +c 选项,那么任何省略该选项的 db2 命令都将恢复为默认行为或 DB2OPTIONS(如果已设置)。所以你必须知道你在做什么,并注意正确测试。