设想一下,假如没有这道“关卡”检查表锁被是否被占有, 而是直接去获取行锁,会是什么结果?
可以看到, 即使表X锁已经被事务A持有,事务B仍然可以获得行锁,这显然是错误的. 没有意图锁以后,行锁的获得和表锁没有任何关系,表锁失去对行锁的控制.
总结一下:
每个事务在尝试获取自己需要的行锁时, 会先通过意图锁检查一下表锁的占用情况,再决定是否继续获得行锁,具体判断规则:
- 如果
表X锁
被占有,则其他事务尝试获得 IS
、IX
均会阻塞,也就不能继续获取行X锁
或行S锁
了. - 如果
表S锁
被占有,则其他事务可以获得IS
, 而获得IX
会阻塞. 从而阻止其他事务获得行X锁
有一个例外,插入意向锁,它本身不是个意向锁