1、一个事务对表中的某一行加了排它锁并且未提交,其他事务想要获得该表的表锁就需要保证:
•当前没有其他事务持有该表的排他锁
•当前没有其他事务持有该表的其中任一行的排它锁
为了检测是否满足第二个条件,就需要在确保users表不存在排它锁的前提下去检测每一行是否存在排它锁,这样的话效率就会很差。因此就出现了意向锁来提高检测互斥的效率。
2、第一个事务获取某一行的排他锁之后其实表中存在两把锁,一把是加在该行上的锁,一把是加在表上的意向排它锁,当其他事务想要获得该表的排他锁时发现已经有事务获得了该表的意向排它锁,那么此次申请该表的排它锁就会失败,而不用一行一行的检测是不是存在某一行被加了锁。
3、意向锁只会和表级的共享锁/排它锁互斥,不会和行级的共享锁/排它锁互斥。具体来讲:共享意向锁和表级共享锁兼容,和标记排它锁互斥;意向排它锁和表级共享锁互斥,和表级排他锁也互斥。
另外,意向锁相互之间是兼容的,即一个事务对表中的一行加锁(同时获得了该表的意向锁),另一个事务可以对该表的另一行加锁,此时同样得到了该表的意向锁。
4、意向锁是由数据库引擎自己维护的,用户无法手动操作意向锁。
参考: