前言
如果没有多粒度锁,就不会产生意向锁。在介绍意向锁之前先引入两个概念显式封锁和隐式封锁。
显式封锁:直接加到数据对象上的封锁,如给某个表加写锁,这个写锁作用在这个表上。
隐式封锁:该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。如果某个表上加了读锁,则默认该表每个元祖均有隐式读锁。
假如事务T要给某个表要加一个读锁,首先要判断该表是否目前是否有写锁(包括显示、隐式封锁),如果该表有写锁,则需要等待。如果该表上没有写锁,因为当前商用的数据库管理系统都包含行级锁和表级锁(是多粒度锁),还需逐个判断该表中每个元祖上是否有写锁,如果有写锁,则还需等待。换句话,在多粒度锁的情况下,每次加锁时,不仅要判断所加资源上是否有锁,而且还需判断下级单元是否包含锁,考虑到判断下级资源是否加有写锁是非常耗资源,产生了意向锁
意向锁概念
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:给表中某个元祖加写锁时,则给表上加意向写锁。
假如事务T要给某个表要加一个读锁,仅需要检测该表上是否有写锁和意向写锁即可,无需每个元祖去检测是否包含写锁,提高了性能。
意向锁种类
意向共享锁(Intent Share Lock,简称IS锁):如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。如果某表上有IS锁,则这个表可以继续加S、IS、IX和SIX类型的锁。
意向排它锁(Intent Exclusive Lock,简称IX锁):如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。如果某表上有IX锁,则这个表可以继续加IS和IX类型的锁。
共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁):如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX。如:对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别元组(所以要对该表加IX锁)。如果某表上有SIX锁,则这个表可以继续加IS类型的锁。
数据锁的相容矩阵
S:读锁、X写锁、IS意向共享锁、IX锁意向排它锁、SIX共享意向排它锁,Y代表相容请求,N代表不相容请求