一分钟深入Mysql的意向锁——《深究Mysql锁》

延伸阅读:

三分钟了解Mysql的表级锁

五分钟了解Mysql的行级锁

mysql锁相关讲解及其应用——《深究mysql锁》了解锁前,一定要先看这篇,了解什么是MVCC,如果我们学习锁,没有MVCC的知识,理解起来会总觉得不明朗。本来我的这个只是个记录,并不是专门的讲给别人看的,后发现有不少人看,我还是专门加上这篇文章的链接。

在《五分钟了解Mysql的行级锁》中说到,InnoDB为了让表锁和行锁共存而使用了意向锁。但是并没有细说为什么如果没有意 向锁的话,表锁和行锁不能共存。 现在就来细说一下。

为什么没有意向锁的话,表锁和行锁不能共存?


举个粟子(此时假设行锁和表锁能共存): 事务A锁住表中的一行(写锁)。事务B锁住整个表(写锁)

但你就会发现一个很明显的问题,事务A既然锁住了某一行,其他事务就不可能修改这一行。这与”事务B锁住整个表就能修改表中的任意一行“形成了冲突。所以,没有意向锁的时候,行锁与表锁共存就会存在问题!

意向锁是如何让表锁和行锁共存的?


有了意向锁之后,前面例子中的事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的写锁时就会失败,因为表上有意向排他锁之后事务B申请表的写锁时会被阻塞

所以,意向锁的作用就是:

当一个事务在需要获取资源的锁定时,如果该资源已经被排他锁占用,则数据库会自动给该事务申请一个该表的意向锁。如果自己需要一个共享锁定,就申请一个意向共享锁。如果需要的是某行(或者某些行)的排他锁定,则申请一个意向排他锁

 说明:意向锁之间都是兼容的,之前是我看错了,Im so sorry参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-intention-locks

意向锁是表锁还是行锁?


首先可以肯定的是,意向锁是表级别锁。意向锁是表锁是有原因的。

当我们需要给一个加表锁的时候,我们需要根据意向锁去判断表中有没有数据行被锁定,以确定是否能加成功。如果意向锁是行锁,那么我们就得遍历表中所有数据行来判断。如果意向锁是表锁,则我们直接判断一次就知道表中是否有数据行被锁定了。

你可能感兴趣的:(MySQL,深究MySQL)