意向锁
在支持多层锁定的数据库中,若事务在某子节点持有读/写锁,则事务在其父节点持有意向锁。
意向锁的含义
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。
例如,对任一元组加锁时,必须先对它所在的关系加意向锁。
于是,事务T要对关系R1加 X锁时,系统只要检查根结点数据库和关系R1是否己加了不相容的锁,而不再需要搜索和检查尺中的每一个元组是否加了X锁。
下面介绍三种常用的意向锁:意向共享锁(Intent Share Lock,简称IS锁);意向排它锁(Intent Exclusive Lock,简称IX锁);共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁)。
意向锁的作用
引进意向锁是为了提高封锁子系统的效率。该封锁子系统支持多种封锁粒度。原因是:在多粒度封锁方法中一个数据对象可能以两种方式加锁 ― 显式封锁和隐式封锁。因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。为此引进了意向锁。意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。例如事务 T 要对某个元组加 X 锁,则首先要对关系和数据库加 ix 锁。换言之,对关系和数据库加 ix 锁,表示它的后裔结点 ― 某个元组拟(意向)加 X 锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。例如,事务 T 要对关系 R 加 X 锁时,系统只要检查根结点数据库和 R 本身是否已加了不相容的锁(如发现已经加了 ix ,则与 X 冲突),而不再需要搜索和检查 R 中的每一个元组是否加了 X 锁或 S 锁。
结论
作用:意向锁提高了锁定父节点时的效率(相当于一个全局标记位)
原理:可以直接通过目标节点的意向锁便得知是否可以对目标表进行加锁,而不需要遍历该节点的所有子节点。
场景:在支持多粒度的层级结构锁定的数据库中,锁定父节点时有效
发散思考
在锁定子节点时,意向锁有价值么?
参考链接:http://term.ccf.org.cn/index.php/%E6%84%8F%E5%90%91%E9%94%81