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

2008年(239)

我的朋友

分类: Sybase

2008-06-17 23:14:45

数据库系统

SYBASE系统采用锁机制作为其并发控制机制。配置参数NUMBER OF LOCKS,设定了整个系统可以使用的锁数目。如果所要求的锁数目超过此参数设置,系统就会报错。

 

1. 锁的类型

 

除了共享锁、排它锁、意图锁、更新锁之外,SYBASE系统引入了需求锁(demand lock)。在第6.3.3一节中,我们讲到:由于不断有新的事务给数据加共享锁,一个事务可能长时间无法获取排它锁,SYBASE系统使用需求锁来解决这个问题。

一个事务申请数据的排它锁,它要等待数据上现有的共享锁被释放。这时其它新的事务可以继续访问该数据,给数据加共享锁。在连续有三个新的事务获取了数据的共享锁之后,最初申请排它锁的事务就给该数据加上需求锁。在数据上存在需求锁之后,系统就不允许新的事务访问该数据,给数据加共享锁,所有新的事务必须等待。这样,在所有的共享锁被释放后,最初的事务就将需求锁转换为排它锁,从而可以进行事务的处理。

 

2. 锁的粒度

 

SYBASE系统锁的粒度,可以划分为:数据库、表、页、记录。可以通过以下方式使用数据库锁:

1)在整个数据库系统启动时,使系统进入单用户模式。

2)在数据库系统正常运行过程中,更改单个数据库的属性,使该数据库只可为特权用户使用。

要使用表锁,可以在命令行或者应用程序中,使用lock table命令。另外表锁也可能由于锁的升级而获得。

对于页锁和记录锁,系统提供了三种锁模式(lock scheme):allpagesdatapagesdatarowsallpagesdatapages模式属于页锁,而datarows属于记录锁。

allpages模式,事务申请锁时,不但要锁定数据所在的页,而且数据所对应的索引页也要被锁定。如果事务申请的是排它锁,这些锁定一直到事务结束才释放。

datapages模式,事务申请锁时,只锁定数据所在的页,数据所对应的索引页不需要锁定。如果事务要更新数据,就要为数据所在的页加排它锁。这时,如果表的数据更新要引起索引中数据的更新,就需要在更新执行时为索引页加排它锁,在更新完成后,就立即释放索引页上的排它锁。而数据页上的排它锁,一直到事务结束才释放。

datarows 模式,其处理方式等同于datapages模式,区别在于datarows模式使用的是记录锁。

在创建表时,可以指定表所使用的锁模式。如果没有指定,就使用配置参数LOCK SCHEME的设定。缺省情况下,系统使用allpages锁模式,该模式虽说降低了系统的并发处理能力,但减少了锁管理的系统开销。

一旦被创建,表的锁模式就确定下来。使用allpages或者datapages模式的表,只能使用页锁和表锁;使用datarows模式的表,只能使用记录锁和表锁。可以使用命令改变一个表的锁模式。

 

3. 锁的转换

 

锁转换在SYBASE系统中出现的频率比较高,除了需求锁的使用之外,还与系统使用了不同的排它锁申请机制有关。在SQL语句需要数据的排它锁时,系统在SQL语句处理的初始阶段,为它分配一个更新锁,即使这时该数据上不存在任何锁。在SQL语句开始执行时,才将更新锁转换为排它锁。因此,在SQL语句最后执行之前,其他的SQL语句仍旧可以访问该数据,从而提高了数据的利用率,提高了事务的并发处理能力。但这种方法同时也增加了锁机制的复杂程度,使系统容易出现锁的问题。

 

4. 锁的升级

 

SYBASE系统中,只存在两种情况下的锁升级:对使用datarows模式的表,可以由记录锁升级为表锁;对使用allpages或者datapages模式的表,可以由页锁升级为表锁。在整个系统范围内,对锁的升级可以使用下列配置参数进行设定:

PAGE LOCK PROMOTION HWM:设定页锁升级的高水平值。一个事务在一个表上获得的页锁,达到该参数的设置后,系统就试图升级为表锁。

PAGE LOCK PROMOTION LWM:设定页锁升级的低水平值。一个事务在一个表上获得的页锁,低于该参数的设置,系统不会进行锁的升级。在页锁的数目超过此参数设置,但没有达到参数PAGE LOCK PROMOTION HWM的设置时,系统就根据参数PAGE LOCK PROMOTION PCT的设置,决定是否需要锁的升级。

PAGE LOCK PROMOTION PCT:设定进行页锁升级的页使用百分比。一个事务在一个表上获得的页锁,超过参数PAGE LOCK PROMOTION LWM的设置,但低于参数PAGE LOCK PROMOTION HWM的设置时,系统就计算事务使用的数据页占表中总数据页的百分比。如果达到此参数设置,系统就试图升级为表锁。

ROW LOCK PROMOTION HWM:设定记录锁升级的高水平值。其处理方式同页锁。

ROW LOCK PROMOTION LWM:设定记录锁升级的低水平值。其处理方式同页锁。

ROW LOCK PROMOTION PCT:设定记录锁升级的使用百分比。其处理方式同页锁。

可以使用命令sp_setpglockpromotesp_setrowlockpromote,在数据库、表的级别上对锁的升级进行设定。对单个表的锁升级设定,具有最高的优先级。

 

5. 锁的等待和超时

 

为了防止事务对锁的无限期等待,SYBASE系统引入了需求锁。配置参数LOCK WAIT PERIOD,在系统范围内指定了锁的等待、超时时间,可以使用set lock命令在命令行或者应用程序中为单个会话设定。

 

6. 隔离级别

 

SYBASE系统使用的四级隔离级别,同SQL-92标准(第6.3.8一节所述)。缺省情况下,系统使用1级的隔离级别。用户可以通过以下方式,对隔离级别进行设置:

1)使用set isolation level命令,在命令行或者应用程序中,设定单个会话的隔离级别。

2)在SQL语句中,设定单个SQL语句的隔离级别。

3)在SQL语句中,为SQL语句中要访问的表设定隔离级别。

 

7. 死锁

 

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

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