MySQL/Intention Locks

MySQL/Intention Locks

https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0512niuxzh/

由两种基本的锁类型(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要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。

数据库锁的相容性矩阵

S、X、IS、IX、SIX:

首先明确:
1.这个矩阵表示 两个事务T1 T2是否可以 同时 对同一个对象加指定的锁。
2.对于SIX=S+IX锁的理解,虽然两个不同事务是不允许同时向同一对象加S,IX锁的。但是在一个事务中是可以即加S锁又加IX锁的的。
因为锁就是保护事务并发的正确性,读和写两种命令在一个事务里就不存在并发的几种错误情况。但看一个事务就不需要考虑并发。理论上可以在一个事务里对同一对象又加S锁又加X锁,但根本没这个必要。

T1加S锁,T2只能加S和IS锁。
X锁排他,pass。
因为加S所后,对应数据的子节点都隐式的加了S锁,所以加IX锁表示其子节点拟加X锁(确实逻辑上可能不会对子节点加锁,但是只要有这个可能性就要保证正确性),X排他,pass。SIX锁同理。

T1加X锁,T2只能干等着。因为X锁排他,优先级最高

T1加IS锁,T2不能加X锁。因为T1有对其子节点加S锁的可能而T2扼杀了这个可能性。
至于T2为什么能加IX锁是因为I锁只是意向锁,所以是可行的,若事务有非意向锁,根据相容矩阵再次判定。SIX锁综上同理。

T1加IX锁,T2不能加S,X,SIX锁的原因不再赘述。(不能加SIX锁的原因,可参考不能加S锁)

T1加SIX锁,T2只能加IS锁。
不能加S,X,IX,SIX锁的原因分别是:
T2加S,T1无法完成SIX锁的IX部分
T2加X,T1首先就无法完成S锁,更别说SIX锁
T2加IX,表示T2意向修改对象子节点,而T1要读对象,若T2修改其子节点便产生并发错误。故pass
T2加SIX,综合上面S和IX的情况。pass


Last update: 2018-05-16 09:24:49 UTC