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

2008年(239)

我的朋友

分类: DB2/Informix

2008-06-17 23:28:22

锁的粒度

数据库系统在运行时可能需要维护很多的锁,不同锁的作用范围、影响到的数据量大小也不一样。例如:一个记录上的共享锁,只作用于该记录;而一个表上的共享锁,相当于为表中的所有记录都加上共享锁。我们使用锁的粒度(lock granularity)来说明锁的作用范围。依据数据库的结构层次,可以将锁的粒度从高到低依次划分为:数据库、表、页、记录。

在数据库级别上加锁,数据库中的所有表、索引、记录等都被锁定。这种锁定方式虽说提高了单个事务的处理能力,但严重地影响系统的并发处理。

在记录级别上加锁,就是为事务要处理的每一条记录都分别加上锁。使用此级别的锁定,数据库系统有更大的并发处理能力,但要花费更多的系统资源去管理锁。

相应地,在表级别上加锁,就是锁定表中的每一条记录;在页级别上加锁,就是锁定数据页中的每一条记录。系统对这两个级别的锁管理以及它们对系统并发能力的影响,处于数据库和记录锁级别之间。

事务到底使用那种级别上的锁定,应当根据事务要处理的数据量来决定。例如:一个事务只是更改表中的一条记录,使用记录级别的锁定将是比较好的选择;而如果一个事务需要更改表中大部分、甚至整个表中的数据,那么使用表级别上的锁定会比较好。

在此,我们引入另外两种比较常用的锁:意向锁、更新锁。

 

1. 意向锁

 

由于锁定可以在多个级别上实现,数据库系统需要考虑的一个问题是:在一个级别上申请给数据加锁,该如何判断是否可以授予呢?

例如:申请一个表的排它锁,该锁能够被授予,必须满足以下条件:

1)在该表上,不存在表级别上的共享锁、排它锁。

2)在该表的所有数据页上,不存在页级别上的共享锁、排它锁。

3)在该表的所有记录上,不存在记录级别上的共享锁、排它锁。

只有这三个条件都满足,表级别上排它锁的申请才会成功。由此我们可以看出,要成功地在较高级别上给数据加锁,所有较低级别上一定不能存在相冲突的锁。为了能够快速地进行判断,数据库系统引入了一种新的锁类型:意向锁。

意向锁表明了一种意图,是在锁级别的高层次上,说明低层次所拥有的锁。事务在任何级别上申请加锁时,对这一级别之上的所有级别,都要加意向锁。由于记录是锁粒度的最低层次,因此在记录级别上不存在意向锁。有两种类型的意向锁:与共享锁相关联的意向锁,称为共享型意向锁;与排它锁相关联的意向锁,称为排它型意向锁。

例如:事务A查询一条记录,除了在该记录上加共享锁之外,还需要分别在数据库、包含该记录的表、包含该记录的数据页上加共享型意向锁;事务B更改整个表中的记录,需要在数据库、表上,分别加排它型意向锁、排它锁。

如果我们看到一个表级别上的排它型意向锁,就可以知道记录级别或者数据页级别上存在排它锁。如果需要进一步确认,就需要在数据页、记录级别上进行检查。

在使用意向锁之后,数据库系统就可以方便地判断一个锁的申请是否可以被授予。例如:要给一个表加排它锁,系统只需检查该表上是否存在共享锁、排它锁、共享型意向锁、排它型意向锁就可以了。只要不存在这些锁,锁就可以被授予;否则就不被授予。

在数据库系统中,还有另外一种意向锁:共享排它型意向(SIX)锁,它相当于以下两种锁的结合:(1)共享锁,(2)排它型意向锁。

对意向锁,用户在操作或者编写应用程序时,不能够直接使用。意向锁是系统决定如何加锁、加锁是否成功的工具,由系统自动进行管理,用户无法控制。

 

2. 更新锁

 

更新锁也表明了一种意图,它对数据的限制介于共享锁和排它锁之间。给数据加上更新锁,就表明事务随后可能需要更新该数据,需要在该数据上加排它锁。由于更新锁只是随后操作的一个事先说明,因此即使数据上存在更新锁,系统也允许其他事务查询该数据,给该数据加共享锁。但是,在该数据上加其它更新锁、排它锁是不允许的。

对于这样的事务:首先查询数据,再根据条件决定是否进行更新处理,就可以在数据查询时申请更新锁,在需要更新时再转换为排它锁。数据库系统引入更新锁,主要是基于事务并发处理能力的考虑,使数据被排它访问的时间尽可能的短。

更新锁一般只在记录级别上使用。使用游标(cursor)更改数据时,最好能使用更新锁。这样要更改的数据不会被其他的事务更改,同时又允许其它的事务读取该数据,提高了数据的利用率。

更新锁和共享锁互相兼容,和排它锁、其它更新锁互斥。不像共享锁和排它锁,更新锁只能在记录级别上实现。

阅读(1037) | 评论(0) | 转发(0) |
0

上一篇:6.3.3 锁的授予

下一篇:6.3.1 锁的类型

给主人留下些什么吧!~~