Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2833226
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: DB2/Informix

2012-03-31 15:35:52

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

阅读(1970) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~