DB2选择行隔离不起作用

时间:2018-05-21 05:37:15

标签: db2 db2-luw

经过这个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. 在并行应用程序中运行更新语句时,它会正常运行。
  5. 我的方法出了什么问题为什么当select被定义为持有exlusive锁时,在并行应用程序中第4步更新行?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

要禁用自动注册,您有不同的选择。您可以在CLP的命令行上执行此操作以影响当前命令行(使用+ c选项),或者您可以使用DB2OPTIONS环境变量为会话永久设置它(通常是个坏主意) ,或者您可以通过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(如果已设置)。因此,您必须知道自己在做什么,并注意正确测试。