什么是意向锁
在多层级锁中的事务中,如果事务在某节点持有读写锁,则事务在其父节点持有意向锁。
这样通过判断目标节点的上层节点是否持有意向锁来进一步决定能不能对下级节点加锁。比如要对表中任一节点加写锁,那么就要先获得整张表的意向锁,如果能获得,进一步对行加锁;如果获得失败,说明其他事物正在对这张表进行写,不可以写。通俗的理解就是,你想读写人家的儿子,得知会他老爸一声。
分类
我们知道锁有共享锁(S)和互斥锁(X)之分,那么自然就派生出意向共享锁(IS)与意向互斥锁(IX)。
- IS:若要对一个节点加S锁,先要对其父节点加IS锁,表明它的子节点有意向加S锁。
- IX: 若要对一个节点加X锁,先要对父节点加IX锁,表明它的子节点有意向加X锁。
- SIX: 共享意向排他锁, 对数据库对象加SIX锁表明,对它加S锁,再加IX锁。比如,对一张表加SIX锁,表示事务要读整张表(所以加S锁),并且更新表的某一行(所以加IX锁)。
有什么好处
避免不必要的检查目标节点的锁状态,比如发现某张表没能获得意向锁,说明有人在用,事务会等待意向锁的释放,而不是固执地一行一行去检查行有没有被上锁, 避免加锁解锁开销。
网友评论