表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表
级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一
个表上加 S 锁,如果表中的一行已被另外的事务加了 X 锁,那么该锁的申请也应被阻塞。
如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决
这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”
的概念。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任
一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它
所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中
每行记录的锁标志位了,系统效率得以大大提高。
2.2.2 意向锁的类型
由两种基本的锁类型(S锁、X 锁),可以自然地派生出两种意向锁:
意向共享锁(Intent Share Lock,简称 IS 锁):如果要对一个数据库对象加S锁,首先
要对其上级结点加IS 锁,表示它的后裔结点拟(意向)加 S锁;
意向排它锁(Intent Exclusive Lock,简称 IX 锁):如果要对一个数据库对象加X 锁,
首先要对其上级结点加 IX锁,表示它的后裔结点拟(意向)加X 锁。
另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,
理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只
有 S+IX 有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,
X+IX=X,这里的“=”指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。
这样我们又可以引入一种新的锁的类型
共享意向排它锁(Shared Intent Exclusive Lock,简称 SIX 锁) :如果对一个数据库对象
加 SIX 锁,表示对它加 S 锁,再加 IX 锁,即 SIX=S+IX。例如:事务对某个表加 SIX 锁,
则表示该事务要读整个表(所以要对该表加S 锁),同时会更新个别行(所以要对该表加 IX
锁)。
这样数据库对象上所加的锁类型就可能有5 种:即S、X、IS、IX、SIX。
具有意向锁的多粒度封锁方法中任意事务 T 要对一个数据库对象加锁,必须先对它的
上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次
序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。