Loading

数据库锁的相容性矩阵

把自己的知乎答案搬来了

从多粒度树的角度着手理解。

在多粒度封锁中,若对一个节点加锁(X、S),意味着这个点的后裔节点也被加以同样的锁。若对一个节点加意向锁,则说明正在对其子节点加(对应的)锁(可理解为一个事务中的先后次序)。任意节点加(X,S)锁时,必须对其所有上级节点加意向锁。多粒度封锁的加锁顺序是自顶向下,释放锁的顺序是自下而上。

上级节点加的意向锁不影响当前节点和其子节点上锁的相容性。

设有事务AB,都对同一数据对象r加锁。

X锁排他,故只要A对r加X锁,B不能再对r及其子节点加锁。

S锁,若A对r加S锁,则r及其子节点均加S锁,故r及其子节点不能加X锁。也就是说B不能对r加X,IX,SIX这些包含X的锁。

IX锁,若A对r加IX锁,则r到该节点路径上的节点全加IX锁,该节点及其子节点全加X锁。为了保证加了X锁的那个子节点上面不加其他的锁,故B一定不能对r加X,S,SIX锁。而至于IS,IX锁,B是可以对r加的,因为要加X,S锁的那个节点可能不同。若要加锁的节点相同则再用X,S锁的相容矩阵解释冲突。

SIX锁,若A对r加SIX锁,对则r先加了S锁,释放后再加IX锁(一次操作中的先后次序),r的子节点分别对应加锁。故B不能对r加{X,SIX,IX锁}并上{X,S,SIX锁}。

IS锁,若A对r加IS锁,那么r到要加S锁的节点路径上的节点全加IS锁,该节点及其子节点全加S锁。故B不能对其加X锁。至于IX,SIX锁是可以加的,因为对应要加锁的子节点可能不同,相同时再按X,S锁的相容矩阵判别即可。

posted @ 2020-03-27 11:18  ArkiWang  阅读(1724)  评论(0编辑  收藏  举报