美团:这个 SQL 语句加了哪些锁?

点击关注公众号,Java干货及时送达👇

e16ccbc95723cbeea608cefb3503a673.jpeg

美团问数据库应该是非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,你会发现其他厂面试基本很少会这样考,所以很多小伙伴遇到这种问题的时候都是一脸懵逼,这篇文章就来详细总结下 InnoDB 存储引擎中的行锁的加锁规则,并辅以实例解释。

首先众所周知,InnoDB 三种行锁:

  • Record Lock(记录锁):锁住某一行记录

  • Gap Lock(间隙锁):锁住一段左开右开的区间

  • Next-key Lock(临键锁):锁住一段左开右闭的区间

哪些语句上面会加行锁?

1)对于常见的 DML 语句(如 UPDATEDELETE 和 INSERT ),InnoDB 会自动给相应的记录行加写锁

2)默认情况下对于普通 SELECT 语句,InnoDB 不会加任何锁,但是在 Serializable 隔离级别下会加行级读锁

上面两种是隐式锁定,InnoDB 也支持通过特定的语句进行显式锁定:

3)SELECT * FROM table_name WHERE ... FOR UPDATE,加行级写锁

4)SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE,加行级读锁

前置知识就不过多介绍了,在学习具体行锁加锁规则之前,小伙伴们需要记住加锁规则的两条核心:

1)查找过程中访问到的对象才会加锁

这句话该怎么理解?比如有主键 id 为 1 2 3 4 5 ... 10 的10 条记录,我们要找到 id = 7 的记录。注意,查找并不是从第一行开始一行一行地进行遍历,而是根据 B+ 树的特性进行二分查找,所以一般存储引擎只会访问到要找的记录行(id = 7)的相邻区间

2)加锁的基本单位是 Next-key Lock

下面结合实例帮助大伙分析一条 SQL 语句上面究竟被 InnoDB 自动加上了多少个锁

假设有这么一张 user 表,id 为主键(唯一索引),a 是普通索引(非唯一索引),b 都是普通的列,其上没有任何索引:

id (唯一索引)a (非唯一索引)b
104Alice
158Bob
2016Cilly
2532Druid
3064Erik

案例 1:唯一索引等值查询

当我们用唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:

  1. 当查询的记录是存在的,Next-key Lock 会退化成记录锁

  2. 当查询的记录是不存在的,Next-key Lock 会退化成间隙锁

查询的记录存在

先来看个查询的记录存在的案例:

select * from user
where id = 25
for update;

结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (20, 25]

不过,由于这个唯一索引等值查询的记录 id = 25 是存在的,因此,Next-key Lock 会退化成记录锁,因此最终的加锁范围是 id = 25 这一行

查询的记录不存在

再来看查询的记录不存在的案例:

select * from user
where id = 22
for update;

结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (20, 25]

这里为什么是 (20,25] 而不是 (20, 22],因为 id = 22 的记录不存在呀,InnoDB 先找到 id = 20 的记录,发现不匹配,于是继续往下找,发现 id = 25,因此,id = 25 的这一行被扫描到了,所以整体的加锁范围是 (20, 25]

由于这个唯一索引等值查询的记录 id = 22 是不存在的,因此,Next-key Lock 会退化成间隙锁,因此最终在主键 id 上的加锁范围是 Gap Lock (20, 25)

案例 2:唯一索引范围查询

唯一索引范围查询的规则和等值查询的规则一样,只有一个区别,就是唯一索引的范围查询需要一直向右遍历到第一个不满足条件的记录,下面结合案例来分析:

select * from user
where id >= 20 and id < 22
for update;

先来看语句查询条件的前半部分 id >= 20,因此,这条语句最开始要找的第一行是 id = 20,结合加锁的两个核心,需要加上 Next-key Lock (15,20]。又由于 id 是唯一索引,且 id = 20 的这行记录是存在的,因此会退化成记录锁,也就是只会对 id = 20 这一行加锁。

再来看语句查询条件的后半部分 id < 22,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 25 这一行停下来,然后加 Next-key Lock (20, 25],重点来了,但由于 id = 25 不满足 id < 22,因此会退化成间隙锁,加锁范围变为 (20, 25)

所以,上述语句在主键 id 上的最终的加锁范围是 Record Lock id = 20 以及  Gap Lock (20, 25)

案例 3:非唯一索引等值查询

当我们用非唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:

  1. 当查询的记录是存在的,除了会加 Next-key Lock 外,还会额外加间隙锁(规则是向下遍历到第一个不符合条件的值才能停止),也就是会加两把锁

    很好记忆,就是要查找记录的左区间加 Next-key Lock,右区间加 Gap lock

  2. 当查询的记录是不存在的,Next-key Lock 会退化成间隙锁(这个规则和唯一索引的等值查询是一样的)

查询的记录存在

先来看个查询的记录存在的案例:

select * from user
where a = 16
for update;

结合加锁的两条核心,这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (8,16]

又因为是非唯一索引等值查询,且查询的记录 a= 16 是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是 (16,32)

所以,上述语句在普通索引 a 上的最终加锁范围是 Next-key Lock (8,16] 以及  Gap Lock (16,32)

查询的记录不存在

再来看查询的记录不存在的案例:

select * from user
where a = 18
for update;

结合加锁的两条核心,这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (16,32]

但是由于查询的记录 a = 18 是不存在的,因此 Next-key Lock 会退化为间隙锁,即最终在普通索引 a 上的加锁范围是 (16,32)

案例 4:非唯一索引范围查询

范围查询和等值查询的区别在上面唯一索引章节已经介绍过了,就是范围查询需要一直向右遍历到第一个不满足条件的记录,和唯一索引范围查询不同的是,非唯一索引的范围查询并不会退化成 Record Lock 或者 Gap Lock。

select * from user
where a >= 16 and a < 18
for update;

先来看语句查询条件的前半部分 a >= 16,因此,这条语句最开始要找的第一行是 a = 16,结合加锁的两个核心,需要加上 Next-key Lock (8,16]。虽然非唯一索引 a = 16 的这行记录是存在的,但此时并不会像唯一索引那样退化成记录锁。

再来看语句查询条件的后半部分 a < 18,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 32 这一行停下来,然后加 Next-key Lock (16, 32]。虽然 id = 32 不满足 id < 18,但此时并不会向唯一索引那样退化成间隙锁。

所以,上述语句在普通索引 a 上的最终的加锁范围是 Next-key Lock (8, 16] 和  (16, 32],也就是 (8, 32]

 

热门内容:

因ChatGPT爆红的大数据培养计划|拿不到年薪25W全额退款

用上这几个开源管理系统做项目,领导看了直呼专业!

ChatGPT 连夜迭代:你老婆不好使了

动态可监控线程池,你还没用起来吗?

 

727fc8d1f0222d93d24cc11e6a00d2de.jpeg

 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8404.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顶级Javaer都在使用的类库,真香!

点击关注公众号&#xff0c;Java干货及时送达&#x1f447; 来源&#xff1a;网络 1.日志库2.JSON解析库3.单元测试库4.通用库5.HTTP 库6.XML 解析库7.Excel 阅读库8.字节码库9.数据库连接池库10.消息库11.PDF 库12.日期和时间库13.集合库14.电子邮件 API15.HTML 解析库16.密码…

让ChatGPT长“手”!Meta爆火新论文,让语言模型学会自主使用工具

鱼羊 Pine 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT爆火&#xff0c;Meta也坐不住了。 微软和谷歌正在搜索引擎那边刺刀拼刺刀呢&#xff0c;谁想Meta冷不防抛出一篇新论文&#xff0c;顿时吸引全场目光&#xff1a; 瞄准ChatGPT的“软肋”&#xff0c;让大语言模型自行学会…

OpenAI 何以掀翻 Google 布局多年的AI大棋?

来源&#xff1a; 飞哥说AI 作者&#xff5c;高佳 创意&#xff5c;李志飞 任何大卫击败歌利亚的故事&#xff0c; 都值得我们重新思考。 2023年从一场巨头之间的巨额合作开始&#xff0c;一场汹涌已久的AI暗战摆上了台面。 随着微软和 OpenAI 融资的推进&#xff0c;双方…

AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略

AIGC之GPT-4&#xff1a;GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略 解读&#xff1a;在2022年11月横空出世的ChatGPT&#xff0c;打遍天下无敌手的时候&#xff0c;就知道会有这么一天&#xff0c;知…

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录 前言一、准确性提升1.创造力2.视觉输入3.更长的上下文 二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。 三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的…

ChatGPT五分钟写完插件,功能完善,还可加需求改BUG

开发者&#xff08;KaiFaX&#xff09; 面向全栈工程师的开发者 专注于前端、Java/Python/Go/PHP的技术社区 詹士 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT写代码&#xff0c;水平究竟如何&#xff1f; 不到5分钟&#xff0c;做出一个WordPress&#xff08;一款内容管理系统…

ChatGPT无限可能性:自然语言生成的奥秘

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; ChatGPT无限可能性&#xff1a;自然语言生成的奥秘 数字化时代&#xff1a;跨越语言和文化障碍 冰岛是北大西洋中部的一个岛国&#xff0c;拥有充满活力的科技产业和…

太香了!用chatGPT写正则

chatGPT热度一直持续不下&#xff0c;我们普通人能做什么&#xff1f; 当然是先用起来&#xff0c;和自己工作结合起来&#xff0c;提高效率。 日常工作中正则使用少不了&#xff0c;可以让gpt来写正则&#xff0c;再也不用去小度查了。 今天推荐下朋友开发的gpt 正则工具&…

一个评测模型+10个问题,摸清盘古、通义千问、文心一言、ChatGPT的“家底”!...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 毫无疑问&#xff0c;全球已经在进行大模型的军备竞赛了&#xff0c;“有头有脸”的科技巨头都不会缺席。昨天阿里巴巴内测了通义千问&#xff0c;今天华为公布了盘古大模型的最新进展。不久前百度公布了文心一言、360也公布…

【前沿技术】问答pk【ChatGPT Vs Notion AI Vs BAT AI 】

目录 写在前面 问题&#xff1a; 1 ChatGPT 1.1 截图 ​1.2 文字版 2 Notion AI 2.1 截图 2.2 文字版 3 BAT AI 3.1 截图 3.2 文字版 总结 序言 所有幸运和巧合的事&#xff0c;要么是上天注定&#xff0c;要么是一个人偷偷的在努力。 突发奇想&#xff0c;问三个…

前京东AI掌门人周伯文入局ChatGPT,亲手创立的衔远科技获天使轮融资数亿元!

日前&#xff0c;全球领先的专注于企业创新数智化的技术服务公司衔远科技宣布已经完成数亿元天使轮融资&#xff0c;本轮融资由启明创投领投&#xff0c;经纬创投跟投。 衔远科技成立于2021年底&#xff0c;致力于让每一件商品都应需而生&#xff0c;让每一位消费者都得偿所愿。…

前京东AI掌门人入局ChatGPT!「不设上限」招揽中国OpenAI合伙人

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI4 又一技术大牛官宣入局ChatGPT。 这一回出手的&#xff0c;是被视作“京东AI开创者”的前京东高级副总裁&#xff0c;周伯文。 就在2月26日晚间&#xff0c;周伯文在朋友圈广发“英雄帖”&#xff0c;称“现不设上限诚招合伙人”&#…

AI落地:程序员如何用AI?

对于程序员来说&#xff0c;真正能提高效率、可落地的AI应用场景都有哪些&#xff1f; 目前已经能切实落地&#xff0c;融入我日常工作生活的有以下几个场景&#xff1a; 开发工作&#xff1a;自然语言生成代码&#xff0c;自动补全代码 日常工作学习&#xff1a;写作、翻译、…

我的周刊(第079期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 ChatGPT 项目推荐 基于 ChatGPT 相关接口衍生的项…

中小学教师ChatGPT的23种用法!

中小学教师ChatGPT的23种用法&#xff01; 近日&#xff0c;ChatGPT引发舆论风暴&#xff0c;火遍全球。作为一款生成式人工智能软件&#xff0c;ChatGPT可以就任何议题生成文本&#xff0c;完成包括回答问题&#xff0c;撰写文章、论文、诗歌在内的多种工作。各界盛赞其“有着…

【软件架构思想系列】分层架构

目录 架构思维概述 “分解+集成” 可以理解为架构最核心的思考方式和方法。

K8S 生态周报| 别慌,DockerHub 不会清退开源组织和开源项目

“ 「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。 ” 大家好&#xff0c;我是张晋涛。 DockerHub 将停止个人免费版 Team 的功能 想必很多人都用过 DockerHub&#xff0c;Docker 刚面世的时候&#xff0c…

ChatGPT,太爆了!

大家好啊&#xff0c;我是了不起&#xff0c;一个热爱开源的程序员~ 自从去年 ChatGPT 刚刚推出的时候&#xff0c;我们团队就上手体验过&#xff0c;当时就让我感觉到非常的震惊&#xff1a;使用好她&#xff0c;绝对能将工作效率提升好几倍&#xff01; 这是当时做的几个小测…

AIGC技术周报|清华、北邮新研究:让文生图AI更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 OpenAGI&#xff1a;当大模型遇见领域专家 “愿原力与大型…

2022.2.26 第十五次周报

文章目录 前言一、论文阅读《Interactive Learning from Policy-Dependent Human Feedback》摘要IntroductionRelated WorkPolicy-dependent反馈Convergent Actor-Critic by Humans (COACH)The Advantage Function and FeedbackConvergence and Update Rule ExperimentConclusi…