DB2 V9.7新特性--当前提交

2123阅读 0评论2012-03-31 TOMSYAN
分类:DB2/Informix

DB2 9.7 使用光标稳定性隔离级别之前,一个写操作(UPDATE)将阻止同一行的读操作

SELECT)。其中的逻辑是,写操作正在修改行,读操作应该等到更新完成后看到最终提交的值。

DB2 9.7 中,有一个新数据库的游标稳定性隔离级别的默认行为。实施这一新的行为时,将使用当

前提交CCcurrently 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

上一篇:DB2 索引与并发性
下一篇:DB2快速入门的捷径