Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427252
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类:

2008-06-17 23:16:42

数据库系统

DB2系统采用锁机制作为其并发控制机制。配置参数LOCKLIST,设定内存中锁表缓冲区的最大空间,每一个数据库都有这样一个锁表缓冲区,存放该数据库中所有的锁定,该参数也决定了数据库中可用锁的数目。

 

1. 锁的类型

 

除了共享锁、排它锁、意图锁、更新锁之外,DB2系统引入了超级排它锁(super exclusive lock)、弱排它锁(weak exclusive lock)等一些锁。这些锁在修改表、索引结构时使用,为的是减少对系统性能影响。

 

2. 锁的粒度

 

DB2系统锁的粒度,可以划分为:数据库、表、页、记录。其中,页锁只能在多维聚集(multi-dimensional clusteringMDC)表中使用,而经常被使用的标准表不能使用页锁。

可以通过以下方式使用数据库锁:在连接而打开数据库时,使数据库处于锁定模式。要使用表锁,可以在命令行或者应用程序中,使用lock table命令。也可以直接改变表的锁模式为表锁。

数据库系统缺省的锁模式为记录锁。所有被创建的表,其最初的锁模式均为记录锁。用户可以根据自己的需要,使用命令更改锁的模式。

 

3. 锁的升级

 

DB2系统中,存在两种锁升级方式:由记录锁升级为表锁、由页锁升级为表锁。只有多维聚集表,才会出现页锁到表锁的升级。

在以下两种情况下,会引起锁的升级:

1)配置参数LOCKLIST,设定内存中锁表缓冲区的最大空间。当数据库中所有锁使用的内存空间超过该参数的设置后,就引起锁的升级。如果出现锁的升级,系统就检查所有活动的表,从最多拥有记录锁的表开始,将记录锁升级为表锁,直至系统中所有锁的内存空间使用达到配置参数LOCKLIST的一半为止。

2)配置参数MAXLOCKS,设定数据库的锁表缓冲区中,一个事务所拥有锁可以使用的内存空间百分比。一旦一个事务所有锁的内存空间使用达到此参数设置,就引起锁的升级。如果出现锁的升级,系统就检查该事务所访问的表,将拥有最多记录锁的表升级为表锁。

 

4. 锁的等待和超时

 

配置参数LOCKTIMEOUT,设定事务在获取锁时等待的最大时间。一旦等待时间达到此参数设置,而事务仍旧没有被授予锁,发出事务的应用程序就会收到错误信息,并进行事务的回退。

 

5. 隔离级别

 

尽管DB2系统也使用四级隔离级别,但仍旧和SQL-92标准(第6.3.8一节所述)略有不同。DB2系统的四级隔离级别如下:

1)未落实的读(uncommitted ReadUR),隔离级别0级。对应SQL-92标准的0级。

2)游标稳定性(cursor stabilityCS),隔离级别1级。在使用游标(cursor)操作数据时,当前被处理的记录需要加共享锁。在游标指针移动到下一条记录后,当前记录的共享锁被释放,而下一条记录被加共享锁。如果不使用游标访问数据,此隔离级别就等同于SQL-92标准的1级。

3)读稳定性(read stabilityRS),隔离级别2级。对应SQL-92标准的2级。

4)可重复读(repeatable read),隔离级别3级。对应SQL-92标准的3级。

缺省情况下,DB2系统使用隔离级别1。用户可以通过以下方式,来设定自己需要的隔离级别:

1)在应用程序的预编译或者绑定时,为要生成的函数包指定隔离级别。

2)通过应用程序和数据库系统的连接方式(如:CLIODBCJDBC等),指定一个会话连接所使用的隔离级别。

3)在单个SQL语句中,为该语句指定隔离级别。该指定有最高优先级。

 

6. 死锁

 

配置参数DLCHKTIME,设定了系统检查死锁的时间间隔。

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