|
1.锁的定义 (1)锁(lock)是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。 (2)通常在数据库中每个数据项都有一个锁。 (3)锁的作用是使并发事务对数据库中数据项的访问能够同步。封锁技术中主要有两种封锁:排他型封锁和共享型封锁。 |
2.两种封锁类型 (1)排他型封锁(X锁)。 ①定义。 a.在封锁技术中最常用的一种锁是排他型封锁(Exclusive Lock),简称为X锁,又称为写锁。 b.如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。 ②使用X锁的两个操作。 a.申请X锁操作“XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准X锁,事务才能继续做下去。 b.解除X锁操作“XRELEASE R”:表示事务要解除对数据R的X锁。 ③实例:加X锁后的事务更新。 a.事务T1先对A实现X锁,更新A值以后,在COMMIT之后。 b.事务T2再重新执行“XFIND A”操作,并对A进行更新(此时A已是事务T1更新过的值)。 c.这样就能得出正确的结果。 |
(2)共享型封锁(S锁) ①定义。 a.采用X锁的并发控制并发度低,只允许一个事务独锁数据。而其他申请封锁的事务只能排队去等。为此,降低要求,允许并发的读,就引入了共享型封锁(Shared Lock),这种锁简称为S锁,又称为读锁。 b.如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。 ②使用S锁的三个操作。 a.申请S锁操作“SFIND R”:表示事务对数据R申请加S锁,若成功,则可以读数据R,但不可以写数据R;如果不成功,那么这个事务将进入等待队列,一直到获准S锁,事务才能继续做下去。 b.升级和写操作“UPDX R”:表示事务要把对数据R的S锁升级为X锁,若成功则更新数据R,否则这个事务进入等待队列。 c.解除S锁操作“SRELEASE R”:表示事务要解除对数据R的S锁。 ③说明。 a.可以看出,获准S锁的事务只能读数据,不能更新数据。 b.若要更新,则先要把S锁升级为X锁。 c.另外,由于S锁只允许读数据,因此解除S锁的操作不必非要合并到事务的结束操作中去,可以随时根据需要解除S锁。 ④实例:S锁会引起死锁。 |
3.封锁的相容矩阵 (1)表中事务T1先对数据作出某种封锁或不加封锁,然后事务T2再对同一数据请求某种封锁或不需封锁。 (2)表中表示它们之间是相容的还是不相容的。 (3)如果两个封锁是不相容的,那么后提出封锁的事务要等待。 |
4.封锁的粒度 (1)封锁对象的大小称为封锁的粒度(granularity)。 (2)封锁的对象。 ①X锁和S锁都是加在某一个数据对象上的。 ②封锁的对象可以是逻辑单元,也可以是物理单元。 ③在关系数据库中,封锁对象可以是属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等逻辑单元;也可以是页(数据页或索引页)、块等物理单元。 ④封锁对象可以很大,比如对整个数据库加锁,也可以很小,比如只对某个属性值加锁。 (3)封锁粒度与并发度的关系。 ①封锁粒度与系统的并发度和并发控制的开销密切相关。 ②封锁的粒度越大,并发度也就越小,但同时系统的开销也就越小。 ③封锁的粒度越小,并发度越高,但系统开销也就越大。 (4)封锁粒度的选择。 ①因此,在一个系统中同时存在不同大小的封锁单元供不同的事务选择使用是比较理想的。 ②而选择封锁粒度时必须同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。 ③一般说来,需要处理大量元组的用户事务可以以关系为封锁单元;而对于一个处理少量元组的用户事务,可以以元组为封锁单位以提高并发度。 |
5.封锁协议 (1)三级封锁协议。 ①在运用封锁机制时,还需要约定一些规则,这些规则称为协议。 ②三级封锁协议,分别在不同程度上解决了并发操作带来的各种问题,为并发操作的正确调度提供一定的保证。 (2)封锁协议的内容和优缺点。 (3)利用封锁技术,可以避免并发操作引起的各种错误,但有可能产生其它三个问题:活锁、饿死和死锁。 |