MySQL:GAP LOCK 栗子的补充解释

对《insert 加锁与死锁分析》一文中 gap lock 栗子做个补充解释,原文是这样的:

如果是在 REPEATABLE-READ,除以上所说的唯一约束冲突外,gap lock 的存在是这样的:
普通索引(非唯一索引)的S/X Lock,都带 gap 属性,会锁住记录以及前1条记录到后1条记录之间的间隙,比如有[4,6,8]记录,delete 6 时除了会对 6 加 X lock,也会锁住(4,6),(6,8)这个两个间隙。

在一些情况下,会发现不仅仅(4,6)的间隙被锁了,记录4好像也被锁了,好像是对[4,6) 这个左闭右开的区间间隙加锁。

真的是这样吗?如何解释呢?

实际上记录 4 是不会加锁的,可以通过 delete 4 不被阻塞来验证。但是确实 insert 4 会被阻塞,而 insert 8 不会被阻塞,会造成记录 4 会加锁的误解。实际上这里还是 gap 锁导致的,而并不是记录锁。

至于为什么 insert 4 会阻塞,而 insert 8 不会被阻塞,与主键值有关系:

如果表没有主键,会有个 row_id 隐藏主键(递增),则 insert 4 实际为对索引插入记录 (4,n),n为主键值,delete 6 实际是对索引删除记录 (6,m),m也为主键值,n 一定会大于 m(因为递增),所以(4,n)在被锁的间隙中。而(8,n)在锁的间隙外,所以不会被阻塞。

如果有主键,则:

  • 如果 n < m,insert(4,n)不会被阻塞;
  • 如果 n > m,insert(4,n)会被阻塞。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. mysql锁知多少 我们进行insert,update,delete,select会加锁吗,如果加锁,加锁步...
    liwsh阅读 5,203评论 0 4
  • 一、锁相关的知识 1.1 MVCC Innodb中是基于MVCC实现的,MVCC(Multi-Version Co...
    Harri2012阅读 1,768评论 1 3
  • MySQL 的加锁处理分析 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有...
    meng_philip123阅读 817评论 0 12
  • 多年前,那个在阳光下追逐的少年,那个在小卖部舔着雪糕的孩子,那个在田埂上飞奔的娃娃,带着你最初的纯真美好,赴一场童...
    小智哒哒阅读 197评论 0 0
  • 逝去之事不可留, 万事三平二满休。 字句人间皆无惧, 一生有爱无尽头。 Accept loss forever B...
    May74阅读 729评论 2 3

友情链接更多精彩内容