封锁的粒度
封锁对象的大小称为封锁粒度。
封锁对象可以是逻辑单元,也可以是物理单元,其中,逻辑单元包括:属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等,物理单元包括:页(数据页或索引页)、物理记录等。
封锁粒度与系统的并发度和并发控制的开销密切相关。因此,选择封锁粒度要遵循一定的原则:封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;封锁的粒度越小,并发度较高,但系统开销也就越大。
多粒度封锁
在一个系统中同时支持多种封锁粒度供不同的事务选择。
选择封锁粒度需同时考虑封锁开销和并发度两个因素, 适当选择封锁粒度。
例如:需要处理大量元组的用户事务:以关系为封锁单元
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位
只处理少量元组的用户事务:以元组为封锁单位
介绍多粒度封锁之前要先了解多粒度树的概念:
多粒度树:
1.以树形结构来表示多级封锁粒度;
2.根结点是整个数据库,表示最大的数据粒度;
3.叶结点表示最小的数据粒度
如下图为四级粒度树:
多粒度封锁协议:
允许多粒度树中的每个结点被独立地加锁
对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁
在多粒度封锁中一个数据对象可能以两种方式封锁:显式封锁和隐式封锁
显示封锁与隐式封锁:
显式封锁:直接加到数据对象上的封锁
隐式封锁:是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。
显式封锁和隐式封锁的效果是一样的,系统检查封锁冲突时,不仅要检查显式封锁,还要检查隐式封锁。
如图:
对关系R1加上了封锁,隶属于关系R1的子节点的元组就加上了对应的隐式封锁。在系统检查封锁的冲突时,不仅要检查关系R1的封锁是否有冲突,还要检查子节点的元组的隐式封锁是否有冲突,以及关系R1的祖先节点数据库是否有封锁冲突。
因此,对某个数据对象加锁,系统要检查三项:
该数据对象有无显式封锁与之冲突
所有上级结点:检查本事务的显式封锁是否与该数据对象上的隐式封锁冲突(由上级结点已加的封锁造成的)
所有下级结点:看上面的显式封锁是否与本事务的隐式封锁(将加到下级结点的封锁)冲突
意向锁
引进意向锁(intention lock)目的:提高对某个数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加相应的意向锁
例如:
要对元组加X锁,应先对元组的祖先节点(关系R1和数据库)加对应的意向锁。
常用意向锁
意向共享锁(Intent Share Lock,简称IS锁)
意向排它锁(Intent Exclusive Lock,简称IX锁)
共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁)
IS锁:如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁
如图:
如果对元组加了S锁,就要对相应的祖先节点(关系R1、数据库)加意向锁IS。
IX锁:如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。原理与上图相似。
如果对元组加了X锁,就要对相应的祖先节点(关系R1、数据库)加意向锁IX。
SIX锁:如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S +IX。
数据锁的相容矩阵:
如矩阵中所示:这里只对其中几条数据做出解释,例如,第3行第3列,事务T1加了IS锁,说明事务T1的子孙节点加了S锁,事务T2也加S锁,读锁之间是相容的,故两个IS锁之间相容;第3行第4列,事务T1加了IS锁,说明事务T1的子孙节点加了S锁,事务T2加IX锁,说明事务T2的某个子孙节点加了X锁,由于加锁的对象可能不是同一个子孙节点,故相容;第4行第4列,如果事务T1加了IX锁,事务T2也对此节点加IX锁,由于加锁对象可能不同,故相容;第4行第5列,如果事务T1加了IX锁,事务T2想要加SIX锁,由于事务IX锁与S锁不相容,故IX与S锁也不想容。
锁的强度
锁的强度是指它对其他锁的排斥程度
一个事务在申请封锁时以强锁代替弱锁是安全的,反之不一定。
如图:
锁强:X > SIX > (S=IX) > IS
具有意向锁的多粒度封锁方法
申请封锁时应该按自上而下的次序进行
释放封锁时则应该按自下而上的次序进行
具有意向锁的多粒度封锁方法
提高了系统的并发度
减少了加锁和解锁的开销
在实际的数据库管理系统产品中得到广泛应用