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

Mysql思维导图分享

上面思维导图可去公众号“bug师姐”回复:扣扣号,获取联系方式后找我免费获得可编辑版本。 后面会继续分享其他思维导图,包括Redis、JVM、并发编程、RocketMQ、RabbtiMQ、Kafka、spring、Zookeeper、Dubbo等等

延伸阅读:

三分钟了解Mysql的表级锁

五分钟了解Mysql的行级锁

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

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

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


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

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

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


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

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

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

 说明:意向锁之间都是兼容的,之前是我看错了,Im so sorry参考:MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking

意向锁是表锁还是行锁?


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

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

  • 20
    点赞
  • 71
    收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 22

打赏作者

bug师姐

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值