“维基解密”创始人被追加起诉与黑客合作窃密
|
这里有一个大问题,最坏的情况下,需要遍历所有的行才能知道是否有行被锁住,这是非常消耗性能的,而意向锁就可以解决这个问题。我们现在再来考虑相同场景下,意向锁如何解决这个问题:
一个事务 A 想要修改表 t 中的行 r,A 首先需要获取表 t 的 IX 锁,然后成功获取 IX 锁之后,再去申请行 r 的 X 锁,申请成功之后,事务 A 此时就持有两个锁,分别是表 t 的 IX 锁和行 r 的 X 锁。此时,有一个事务 B 想要使用 ALTER TABLE 语句修改表 t 的结构,该语句需要获取表 t 的 X 锁,事务 B 可以查看表 t 上是否存在锁来判断表中的行是否被上锁,当发现表 t 上存在 IX 锁,事务 B 就会被阻塞,因为它知道表中已经有行被锁定,所以无法申请到表 t 的 X 锁。 注意:这里的 X 锁、S 锁说的也是表级锁,不要理所当然的想成了行级锁。 为什么会有意向锁的出现呢?我们考虑如下场景(假设不存在意向锁):
一个事务 A 想要修改表 t 中的行 r,所以 A 获取行 r 的 X 锁,事r务 A 现在持有一个行锁。此时,有一个事务 B 想要使用 ALTER TABLE 语句修改表 t 的结构,该语句首先需要获取表 t 的 X 锁,但是此时事务 B 并不知道表中是否有行被锁住,所以它只能一行一行去遍历,然后把遍历的行也锁住,直到发现表中没有行在之前已经被锁住,现在它就可以修改表的结构了。但是它发现表中已经存在一些行被锁住,那么它就不能修改表结构,需要等这些锁都释放。 最左边是持有的锁,最上面是想要申请的锁。从图中可以看出,只要跟 X 锁相关的,都会冲突,也就是会造成阻塞。 意向锁 InnoDB 允许多种粒度的锁共存,所以会有表锁和行锁共存的情况。为了让多种粒度的锁可以共存,InnoDB 使用了意向锁。意向锁是表级锁,它是为了表明有一个事务正在持有锁或者打算申请一个锁。 意向锁有两种类型:
IS 和 IX 只是为了表达出一种意图,它们除了全表请求之外,不会阻塞任何操作。它们的主要目的只是为了表示持有一个行锁,或者打算获取行锁。 意向锁的使用规则如下:
这里有一个很重要的点:就是只有获取表中的行锁时,才会需要先申请意向锁。 如果是执行 ALTER TABLE 等需要锁定整个表的语句,是不需要申请意向锁的,可以直接去申请表级 X 锁。
表级别下的X锁、S锁、IS 锁和 IX 锁的兼容性如下: (编辑:宜春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

