经过这个link我应该能够isolate
使用select语句读取的rows
但是当我在下面的步骤中运行时它不会锁定行
create table test ( col varchar(50));
INSERT INTO test values('100');
select COL from mdmsysdb.test WITH RS USE AND KEEP EXCLUSIVE LOCKS
或select COL from mdmsysdb.test WITH RR USE AND KEEP EXCLUSIVE LOCKS
我的方法出了什么问题为什么当select被定义为持有exlusive锁时,在并行应用程序中第4步更新行?
答案 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(如果已设置)。因此,您必须知道自己在做什么,并注意正确测试。