WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: DB2/Informix
2012-03-31 15:35:52
在 DB2 9.7 使用光标稳定性隔离级别之前,一个写操作(UPDATE)将阻止同一行的读操作
(SELECT)。其中的逻辑是,写操作正在修改行,读操作应该等到更新完成后看到最终提交的值。
在DB2 9.7 中,有一个新数据库的游标稳定性隔离级别的默认行为。实施这一新的行为时,将使用当
前提交CC(currently committed)的语义。有CC 之后写操作不会阻止访问同一行中的读操作。如
果您使用了隔离级别未提交的读操作(UR),这种情况过去是可能发生的。但现在的差别是,UR 读
操作读到的是未提交的值, CC 读操作读到的是提交的值。当前提交值是致力于写操作的开始前的
值。例如,表T1 具有以下内容:
FIRSTNAME LASTNAME
Raul Chong
Jin Xie
现在,您的应用程序AppA 执行这个语句,但不提交:
update T1 set lastname = 'Smith' where firstname = 'Raul'
接下来,应用程序AppB 执行此提交:
select lastname from T1 where firstname = 'Raul' with CS
在 DB2 9.7 之前,这条语句将挂起,因为它正在等待由AppA(写操作)更新语句的排他锁被释放。
在DB2 9.7 当前提交(新数据库默认)能让语句返回当前提交的值,即Chong。请注意,即使CS
是默认值,为清楚起见我们还是把”with CS”包括在提交语句中。我们将在后一章节讨论这个子句。
如果AppB 尝试这个语句:
select lastname from T1 where firstname = 'Raul' with UR
由于UR 的隔离使用,其结果将是未提交的值Smith 。这个例子说明, CC 程序具有更好的并发功
能使读操作能够读到一个正在更新的行。另一个在DB2 9.7 之前会引起争议的情况是读操作阻止写操
作访问行。这就是为什么即使是读操作也建议使用一个提交的原因之一,因为这将确保共享(S)锁
被释放。有了CC 之后这不再是一个问题,读操作不会阻塞写操作。对于那些没有提交的INSERT 操
作,读操作将默认地跳过他们,结果就是不显示这些行。对于DELETE 命令,读操作应该也可以跳
过(忽略)受影响的行,但行为取决于DB2 注册表的变量值DB2_SKIPDELETED。其他注册表变量
和BIND 和PREPARE 命令属性可以改变CC 的默认行为。记住:当前提交意味着它只会显示当前提
交的信息,因此未提交的INSERT 或DELETE 操作将被忽略。如前所述,在新数据库CC 是默认
的。如果您想将其关闭,或把一个早期版本创建的数据库升级到DB2 9.7,您可以更新数据库配置
CUR_COMMIT 的值。例如,将SAMPLE 数据库的CC 关闭可以写成:
db2 update db cfg for sample using CUR_COMMIT off
db2stop
db2start