当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL使用表锁和行锁的场景详解

MySQL使用表锁和行锁的场景详解

来源:脚本之家 2022-12-29 12:46:50 0浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《MySQL使用表锁和行锁的场景详解》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

虽然对 MySQL 的知识点挺熟悉的,但一开始看到这个问题,树哥也是有点懵,我还真没从这个角度去思考过。大家可以暂时 1 分钟思考下答案,后面我将带大家弄清楚这个问题。

对于这个问题,我只能粗略地想起一些片段,例如:

  • 对于表级锁而言,当执行 DDL 语句去修改表结构时,会使用表级锁。
  • 对于行级锁而言,一般情况下都会默认使用行级锁,貌似是需要有索引匹配到才行。

上面就是我粗略想到的答案,不知道大家思考的答案是否和我一样呢?下面就让我带着大家来温习下 MySQL 的锁吧!

文章思维导图

对于数据库而言,其锁范围可以分为:

  • 全局锁
  • 表级锁
  • 行级锁

全局锁

全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。你可以理解为,全局锁基本上把数据所所有的变更语句都锁住了。

全局锁的典型场景应用场景是全库逻辑备份,也就是把整个库每个表都 select 出来存起来。上面说到全局锁会锁住所有变更语句,但这只是对于 MyISAM 存储引擎而言的。对于 Innodb 而言,其可以利用 MVCC 实现数据的一致性视图,从而不需要锁整个库就可以实现全库的数据备份。

表级锁

表级锁可以分为:表锁、元数据锁、意向锁三种。

表锁

表锁,顾名思义就是对某个表加锁。

那什么时候会使用表锁呢?

一般情况是对应的存储引擎没有行级锁(例如:MyIASM),或者是对应的 SQL 语句没有匹配到索引。

对于第一种情况而言,因为对应存储引擎不支持行锁,所以只能是使用更粗粒度的锁来实现,这也比较好理解。

对于第二种情况而言,如果存储引擎支持行锁,但对应的 SQL 就没有使用索引,那么此时也是会全表扫描,那此时也是会使用表锁。例如下面的语句没有指定查询列,或者指定了查询列但是并没有用到索引,那么也是会直接锁定整个表。

// 没有指定查询列
select * from user;
// 指定查询列,但是没有用到索引
select * from user where name = 'zhangsan';

上面说的索引,可以说是判断是否会用行级锁的关键。但我想到一个问题:如果查询或更新用到了索引,但是查询或更新的数据特别多,占全表的 80% 甚至更多,这时候是会用表锁,还是行锁呢? 这是一个很有意思的问题,感兴趣的朋友自行弄个测试表验证一下,后续有机会我们再聊聊这个问题。

元数据锁

元数据,指的是我们的表结构这些元数据。元数据锁(Metadata Lock)自然是执行 DDL 表结构变更语句时,我们对表加上的一个锁了。

那什么时候会使用元数据锁这个表级锁呢?

当我们对一个表做增删改查操作的时候,会加上 MDL 读锁;当我们要对表结构做变更时,就会加 MDL 写锁。

意向锁

意向锁,本质上就是空间换时间的产物,是为了提高行锁效率的一个东西。

在 InnoDB 中,我们对某条记录进行锁定时,为了提高并发度,通常都只是锁定这一行记录,而不是锁定整个表。而当我们需要为整个表加 X 锁的时候,我们就需要遍历整个表的记录,如果每条记录都没有被加锁,才可以给整个表加 X 锁。而这个遍历过程就很费时间,这时候就有了意向锁的诞生。

意向锁其实就是标记这个表有没有被锁,如果有某条记录被锁住了,那么就必须获取该表的意向锁。所以当我们需要判断这个表的记录有没有被加锁时,直接判断意向锁就可以了,减少了遍历的时间,提高了效率,是典型的用空间换时间的做法。

那么什么时候会用到意向锁呢?

很简单,就是在对表中的行记录加锁的时候,就会用到意向锁。

行级锁

千呼万唤,终于来到了行级锁。

要知道的是,行级锁是存储引擎级别的锁,需要存储引擎支持才有效。目前 MyISAM 存储引擎不支持行级锁,而 Innodb 存储引擎则支持行级锁。而全局锁、表级锁,则是 MySQL 层面就支持的锁。

那么什么时候会使用行级锁呢?

当增删改查匹配到索引时,Innodb 会使用行级锁。

如果没有匹配不到索引,那么就会直接使用表级锁。

总结

文章最后,我们回顾一下开头提出的问题:Innodb 啥时候用表锁,啥时候用行锁?

表级锁包括:表锁、元数据锁、意向锁。

对于表锁而言,当存储引擎不支持行级锁时,使用表锁。SQL 语句没有匹配到索引时,使用表锁。

对于元数据锁而言,对表做增删改查时,会加上 MDL 读锁。对表结构做变更时,会加上 MDL 写锁。

对于意向锁而言,对表中的行记录加锁时,会用到意向锁。

而对于行级锁而言,增删改查匹配到索引时,会使用行级锁。

文章思维导图

以上就是《MySQL使用表锁和行锁的场景详解》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
一文详解MySQL不同隔离级别都使用什么锁一文详解MySQL不同隔离级别都使用什么锁
上一篇
一文详解MySQL不同隔离级别都使用什么锁
CentOS7下安装MySQL5.7.39的详细过程
下一篇
CentOS7下安装MySQL5.7.39的详细过程
评论列表
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    308次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    325次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    294次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    472次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    457次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码