矩阵如下:
请求的模式 | IS | S | U | IX | SIX | X |
---|---|---|---|---|---|---|
意向共享 (IS) | 是 | 是 | 是 | 是 | 是 | 否 |
共享 (S) | 是 | 是 | 是 | 否 | 否 | 否 |
更新 (U) | 是 | 是 | 否 | 否 | 否 | 否 |
意向排他 (IX) | 是 | 否 | 否 | 是 | 否 | 否 |
意向排他共享 (SIX) | 是 | 否 | 否 | 否 | 否 | 否 |
排他 (X) | 否 | 否 | 否 | 否 | 否 | 否 |
首先要明确下面的结论
- 1.这个矩阵表示 两个事务T1 T2是否可以 同时 对同一个对象加指定的锁。
- 2.对于SIX=S+IX锁的理解,虽然两个不同事务是不允许同时向同一对象加S,IX锁的。但是在一个事务中是可以即加S锁又加IX锁的的。因为锁就是保护事务并发的正确性,读和写两种命令在一个事务里就不存在并发的几种错误情况。但看一个事务就不需要考虑并发。理论上可以在一个事务里对同一对象又加S锁又加X锁,但根本没这个必要。
- T1加S锁,表示数据的子节点都是隐式的加了 S 锁
- T2 加 S 相容 都是读锁
- T2 加 IS 相容 都是读锁
- T2 加 IX ,不相容, IX 对子节点 意向 加 X 锁(逻辑上可能不会对子节点加 X ,但是只要这个可能性存在就要保证正确性) ,和 S 锁冲突
- T2 加 SIX, 不相容, 同 上面加 IX
- T2 加 X , 不相容, S 和 X 冲突
- 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
网友评论