当前位置:首页 > 文章列表 > 数据库 > MySQL > 面试必问的数据库中的锁

面试必问的数据库中的锁

来源:SegmentFault 2023-01-14 17:41:43 0浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《面试必问的数据库中的锁》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下MySQL,希望所有认真读完的童鞋们,都有实质性的提高。

IT技术人员面对面试、跳槽、升职等问题,如何快速成长,获得大厂入门资格和升职加薪的筹码?与大厂技术大牛面对面交流,解答你的疑惑。《从职场小白到技术总监成长之路:我的职场焦虑与救赎》活动链接:码客

行锁

前言部分,我们引出了锁。读写和写写之间可能都需要加锁,但是读读之间是不需要的。 有没有什么想法,我们前几天才看了 ReentrantReadWriteLock 的实现,数据库其实跟它差不了太多。

在数据库中,读操作需要获取共享锁(Shared Locks),一般简称为S锁;写操作需要获取独占锁(Exclusive Locks),一般简称为X锁。

而且锁之间的互斥关系跟 ReentrantReadWriteLock 也可以说基本一致,只是这里不存在重入次数,将线程的概念换成了事务。

  • 读取记录时要获取记录的S锁,修改记录时要获取记录的X锁。
  • S锁可以由多个事务共同持有,X锁只能单个事务持有.
  • 事务1持有一条记录的S锁,此时事务2想要持有该记录的X锁的话会被阻塞,直到事务1放弃S锁
  • 事务1持有一条记录的S锁时,此时别的事务不管是S锁还是X锁都不可以获得
兼容性 X S
X 不兼容 不兼容
S 不兼容 兼容

锁定读

上边介绍完了锁,我们其实可以发现如果按上边所说,仍然不能解决银行存钱场景中的,事务1获取S锁读取了数据,此时事务2仍然可以获取事务的S锁继续读取,那么,我们就在读取记录时获取该记录的X锁。上述两种不同的读取加锁方式的实现分别如下

  SELECT ... LOCK IN SHARE MODE;

这是读取时获取S锁

   SELECT ... FOR UPDATE

这样读取后会为读取到的记录加X锁

写操作

DELETE

先获取指定记录的X锁,再进行删除标记(应该了解不会删除记录而只是打标记吧~

UPDATE

更新如果更新了记录的键值对需要先获取X锁删掉记录再进行Insert新纪录;没变键值对的话直接获取X锁进行原地修改

Insert

隐式锁,既不是S锁也不是X锁。

表锁

上边说了针对记录的行锁,同样还有表锁,其实相对于行锁,无非就是作用范围变大了,由单条记录变为了整个表,除此之外的兼容性规则完全一样。不过注意表锁和行锁间的互斥,比如一个事务获得整个表的S锁,别的事务既可以获得这个表的S锁,也可以获得表中某条记录的S锁,至于S锁,就别想了,我们说了,规则跟上边一样,不再赘述。

表锁种需要注意的只有一个意向锁,即如果我们想给表加X锁,此时表任意一条记录都能有S锁或者X锁,如果我们想给表加S锁,表中任意一条记录都不能有X锁。那么,问题来了,我们怎么直到表中任意一条记录有没有锁呢?

不可能遍历吧?当然不可能,实际上是当事务准备在某条记录加X锁时,就会在表上加一个IX锁;当事务准备在某条记录加S锁时,就会在表上加一个IS锁.这样当别的事务来,一看表有IX或者IS就知道这个表中的记录有没有X锁或者S锁了。IX和IS只是代表表中有记录持有X锁或者S锁,所以他们俩并不互斥,当然了IX和IX也不互斥。

说到表锁,不得不提下MyISAM、MEMORY这些引擎,他们都采用表锁,而且不支持事务,是基于会话的,这种大粒度的锁效率是非常慢的,所以这些存贮引擎一般只适用于只读的场景中

InnoDb中的行级锁

Record Locks

记录锁,其实就是S锁和X锁

Gap Locks

解决幻读就在于此。这个锁可以锁住某条记录和它前边记录之间的间隙,使得该间隙不能插入记录。

Next-Key Locks

不翻译了就,作用是锁住指定记录及其前边的间隙,即前两种锁的合体

Insert Intention Locks

插入意向锁,很无聊的一个锁。当事务被间隙锁阻塞不能成功插入时,会在该间隙生成一个插入意向锁,当可以插入时便获得插入意向锁

隐式锁

这个挺有意思的。试想这么一个场景,我们刚插入一个记录,此时别的事务就过来要这个记录的S锁进行读取或X锁进行修改,很明显这会造成脏读或者脏写问题。隐式锁由此而来。

对于聚簇索引记录,有一个隐藏列trx_id,记录着最后改动这条记录的事务id(MVCC才说过的),很自然的,新插入的记录的trx_id就是他自己的事务id,如果其他事务此时想获得该记录的S锁或者X锁时,会检查trx_id代表的事务是否是当前活跃事务,如果是的话,帮助该事务创建一个X锁(也就是为当前事务创建⼀个锁结构,is_waiting属性是false),然后自己进入等待状态(也就是为⾃⼰也创 建⼀个锁结构,is_waiting属性是true)。

对于二级索引,没有trx_id属性,但是在⼆级索引页面的Page Header部分有⼀ 个PAGE_MAX_TRX_ID属性,该属性代表对该⻚⾯做改动 的最大的事务id,如果PAGE_MAX_TRX_ID属性值⼩于 当前最小的活跃事务id,那么说明对该⻚⾯做修改的事 务都已经提交了,否则就需要在⻚⾯中定位到对应的二级 索引记录,然后回表找到它对应的聚簇索引记录,然后再重复情景聚簇索引的做法。

事务id相当于加了⼀个隐式锁。别的事务在对这条记录加 S锁或者X锁时,由于隐式锁的存在,会先帮助当前事务生成一 个锁结构,然后⾃⼰再⽣成⼀个锁结构后进⼊等待状态

InnoDb中的表锁

IS和IX以及S和X前边说过。

数据库中我们常用的一个主键自增,其实就是表锁的一个体现。 执行每条插入语句时都会在表上加一个AUTO-INC锁,然后为每条待插⼊记录的 AUTO_INCREMENT修饰的列分配递增的值,在该语句执 ⾏结束后,再把AUTO-INC锁释放掉。这样⼀个事务在持 有AUTO-INC锁的过程中,其他事务的插⼊语句都要被阻 塞,可以保证⼀个语句中分配的递增值是连续的。 该锁尤其适用于无法确定插入记录的条数的插入

轻量级锁

在为插⼊语句⽣ 成AUTO_INCREMENT修饰的列的值时获取⼀下这个轻量 级锁,然后⽣成本次插⼊语句需要⽤到的 AUTO_INCREMENT列的值之后,就把该轻量级锁释放 掉,并不需要等到整个插⼊语句执⾏完才释放锁。 即先通过轻量级锁对AUTO_INCREMENT修饰的列进⾏赋值。 该锁适用于确定要插入的记录条数

总结

其实很多东西都是相通的,尤其是我们前边说过类似共享锁和独占锁的概念,这里就很好理解~其他的,也没什么好说的,无非就是锁的作用范围和时机的一些问题,多看几遍自然就熟了~

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

到这里,我们也就讲完了《面试必问的数据库中的锁》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
MySQL Query的优化MySQL Query的优化
上一篇
MySQL Query的优化
你肯定需要的MySQL常见四问
下一篇
你肯定需要的MySQL常见四问
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 毕业宝AIGC检测:AI生成内容检测工具,助力学术诚信
    毕业宝AIGC检测
    毕业宝AIGC检测是“毕业宝”平台的AI生成内容检测工具,专为学术场景设计,帮助用户初步判断文本的原创性和AI参与度。通过与知网、维普数据库联动,提供全面检测结果,适用于学生、研究者、教育工作者及内容创作者。
    18次使用
  • AI Make Song:零门槛AI音乐创作平台,助你轻松制作个性化音乐
    AI Make Song
    AI Make Song是一款革命性的AI音乐生成平台,提供文本和歌词转音乐的双模式输入,支持多语言及商业友好版权体系。无论你是音乐爱好者、内容创作者还是广告从业者,都能在这里实现“用文字创造音乐”的梦想。平台已生成超百万首原创音乐,覆盖全球20个国家,用户满意度高达95%。
    29次使用
  • SongGenerator.io:零门槛AI音乐生成器,快速创作高质量音乐
    SongGenerator
    探索SongGenerator.io,零门槛、全免费的AI音乐生成器。无需注册,通过简单文本输入即可生成多风格音乐,适用于内容创作者、音乐爱好者和教育工作者。日均生成量超10万次,全球50国家用户信赖。
    26次使用
  •  BeArt AI换脸:免费在线工具,轻松实现照片、视频、GIF换脸
    BeArt AI换脸
    探索BeArt AI换脸工具,免费在线使用,无需下载软件,即可对照片、视频和GIF进行高质量换脸。体验快速、流畅、无水印的换脸效果,适用于娱乐创作、影视制作、广告营销等多种场景。
    28次使用
  • SEO标题协启动:AI驱动的智能对话与内容生成平台 - 提升创作效率
    协启动
    SEO摘要协启动(XieQiDong Chatbot)是由深圳协启动传媒有限公司运营的AI智能服务平台,提供多模型支持的对话服务、文档处理和图像生成工具,旨在提升用户内容创作与信息处理效率。平台支持订阅制付费,适合个人及企业用户,满足日常聊天、文案生成、学习辅助等需求。
    30次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码