MySql之锁的详解(干货请备好咖啡)

MySQL 锁 事务在从数据库中取数据时,会将该数据的版本也取出来(v1),当事务对数据变动完毕想要将其更新到表中时,会将之前取出的版本v1与数据中最新的版本v2相对比,如果v1=v2,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许事务对表中的数据进行修改,并且修改时version会加1,以此来表明数据已被变动。也就是说,无论是行级或是表级,如果对某数据上了共享锁 ,允许其他事务也加共享锁,共享锁和共享锁不互斥),但是不能写,也就是。间隙指的是两个记录之间逻辑上尚未填入数据的部分,是一个左开右开空间。 阅读详情

1.锁的概念

在数据库中,除传统的计算资源(如 CPU 、 RAM 、 I/O 等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制 ,因此产生了数据库锁 。

加锁的目的是什么?

数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影响。

如果你想一个人静一静,不被别人打扰,那么请在你的房门上加上一把锁。

2.锁的分类

类型 说明
全局锁 对整个数据库加锁
表级锁 每次操作锁住整张表,分为表锁、意向锁、元数据锁以及AUTO-INC锁
行级锁 每次操作锁住对应的行数据,分为记录锁、间隙锁以及临键锁

3.全局锁

全局锁就是对整个数据库实例加锁。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:

  • 数据更新语句MDL(数据的增删改);
  • 数据定义语句DDL(包括建表、修改表结构等);
  • 更新类事务的提交语句。

全局锁的命令:

Flush tables with read lock

执行后,整个数据库就处于只读状态了。如果需要释放锁请执行命令:

unlock tables

当然,当会话断开了,全局锁会被自动释放。

全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

加全局锁又会带来什么缺点呢?

加上全局锁,意味着整个数据库都是只读状态。

那么如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。

  • 案例一:
-- 会话窗口1,操作如下:
-- 1.打开一个数据库连接,加全局锁
flush tables with read lock;
-- 4.释放锁
unlock tables;
-- 会话窗口2,操作如下:
-- 2.查询表
select * from mylock;
-- 3.执行删除语句,失败
delete from mylock where id = 1;
-- 5.再次执行删除语句,成功
delete from mylock where id = 1;

注意:上述案例请按照序号执行。

4.表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、

InnoDB、BDB等存储引擎中。MySQL 里面表级别的锁有这几种:

  • 表锁;
  • 元数据锁(MDL);
  • 意向锁;
  • AUTO-INC 锁;

4.1.表锁

表锁由 MySQL Server 实现,一般在执行DDL语句时会对整个表进行加锁,比如说 ALTER TABLE 等操作。在执行 SQL 语句时,也可以明确指定对某个表进行加锁。命令如下:

-- 表级别的共享锁,也就是读锁;
lock tables 表名 read;
-- 表级别的独占锁,也就是写锁;
lock tables 表名 write;

表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。

也就是说如果本线程对某表加了「共享表锁」,那么本线程接下来如果要对某表执行写操作的语句,是会被阻塞的,当然其他线程对某表进行写操作时也会被阻塞,直到锁被释放。

要释放表锁,可以使用下面这条命令,会释放当前会话的所有表锁:

unlock tables

另外,当会话退出后,也会释放所有表锁。

不过尽量避免在使用 InnoDB 引擎的表使用表锁,因为表锁的颗粒度太大,会影响并发性能,InnoDB 牛逼的地方在于实现了颗粒度更细的行级锁。

  • 案例一:表级共享读锁
-- 会话1窗口,操作如下:
-- 1.加表级共享读锁
lock tables mylock read;
-- 2.查询数据
select * from mylock;
-- 3.插入数据
-- 1099 - Table 'mylock' was locked with a READ lock and can't be updated
insert into mylock values(1,'小强');
-- 9.释放锁
unlock tables;
-- 会话2窗口,操作如下:
-- 4.在会话2窗口再次加表级共享读锁,成功
lock tables mylock read;
-- 5.查询数据
select * from mylock;
-- 6.新增数据
-- 1099 - Table 'mylock' was locked with a READ lock and can't be updated
insert into mylock values(1,'小明');
-- 7.释放锁
unlock tables;
-- 8.再次新增数据,由于会话1窗口有表级读锁,所以处于等待状态
insert into mylock values(1,'小明');

注意:上述案例请按照序号执行。

  • 案例二:表级独占写锁
-- 会话1窗口,操作如下:
-- 1.加表级排他锁
lock tables mylock write;
-- 2.当前会话被锁定的表执行查询操作被阻塞
-- select * from mylock;
-- 3.执行修改操作,OK
update mylock set name = '小红' 
【MySQL】如何理解MySQL的锁(图文并茂,一网打尽) 这里博主整理我们常见的MySQL中锁的概念,还介绍了面试中 常问的关于乐观锁、悲观锁的 一些特点。后续还有更多内容与大家分享~ 阅读详情

相关推荐

被问懵的 MySQL 面试题:索引到底用在哪?我用 5 个故事讲明白了!

MySQL面试问你“索引使用场景”,别只会说“加快查询”!本文用真实项目故事,带你深入理解5大经典索引使用场景,帮你轻松答出面试加分项,避免性能踩坑!

孤芳不自赏 904

MySQL 社招面试题:视图?我用一个故事讲明白

在 MySQL 面试中,“视图”是个既简单又能挖深的高频题。它能简化复杂查询、保护数据安全,还能提升维护性。本篇用故事带你全面掌握视图的概念、特点、场景、优缺点,让你面试答得又全又稳。

孤芳不自赏 919

MySQL锁

遇见已是上上签 岂敢追求到永远MyISAM使用表级锁,InnoDB采用更细粒度的行级别锁,提高了数据表的性能。InnoDB行级别的锁通过索引来实现,如果查询条件中有主键则锁定主键,如果有索引则先锁定对应索引然后再锁定对应的主键(可能造成死锁),如果没有索引则会锁定整个表。悲观锁:操作数据库时采用悲观的态度,认为别人会在此时并发访问数据库。

Mr.xing的博客 3073

MySQL图形界面客户端

图形界面客户端 使用图形界面客户端操作数据库更直观、方便。下面三个客户端都能操作MySQL,各有各自的优点。 1、Navicat Premium 安装包下载链接:https://pan.baidu.com/s/1e0KKZn8xEnQXCLPLfzYdow 密码:jk6f 新建连接: 建立MySQL连接: 点击“确定”。 然后可以看到自己建的数据库、表,也可以利用右键建立...

LDC,公众号【轻松学编程】 3万+

windows10安装mysql5.7版本

windows安装mysql5.7 1、下载 下载mysql-5.7.28-winx64.zip 方式1:官网,选择mysql-5.7.28-winx64 方式2:关注公众号“轻松学编程”,回复mysql57获取 2、添加my.ini 解压到自己指定的路径,添加my.ini与sqlData文件夹 my.ini内容 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql

LDC,公众号【轻松学编程】 481

django设置MySQL连接池

django设置MySQL连接池

LDC,公众号【轻松学编程】 3255

Claude Code 使用 OpenAI Codex(GPT-5.3-Codex)完整配置教程

通过 LiteLLM 可以让 Claude Code 调用任何模型,包括:OpenAIDeepSeekGemini本地模型↓↓优点:不依赖 Anthropic API可自由切换模型支持统一 AI Gateway这种“LLM Gateway 架构”正在成为 AI 开发工具的主流实践。

Jacobe_zhao的博客 1万+

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

Aveva Marine C# 二次开发入门001

1# 引用 C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.dll C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.ApplicationFramework.Presentation;usi...

weixin_30245867的博客 1911

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1284

边缘智能新篇章:RK3588上YOLOv8姿态估计的轻量化部署与性能优化实战

本文详细介绍了在RK3588平台上部署和优化YOLOv8姿态估计模型的完整流程。通过模型转换、ONNX中间表示和性能优化策略,实现在边缘设备上的高效实时推理,为嵌入式AI应用提供可行的轻量化解决方案。

ik6789012的博客 151

vrep和matlab,使用Matlab与V-REP联合仿真 - Play V-REP with Matlab

OS: Win10 x64Matlab: R2016bV-REP: V-REP PRO EDU v3.5.0 下载、安装与支持V-REP操作基础V-REP仿真基础Matlab环境准备一个简单的例子对V-REP有一定了解的读者可以直接跳到第三节Matlab环境准备。下载、安装与支持V-REP提供Windows、Linux和MacOS三个平台的应用程序支持,任意平台都提供教育版和专业版两个版本。教育版...

weixin_42660494的博客 3211

vue-vben-admin 打包编译报错Failed to resolve entry for package “@vben-core/design“ 的解决方法

如果你在你是不是在 apps/子目录下执行了 build?# 项目根目录 pnpm build而不是在下面单独打包。这个问题本身不复杂,但非常容易被误导去“怀疑依赖、怀疑配置、怀疑人生”。实际上,只要理解vue-vben-admin 是 monorepo 架构,很多类似问题都会迎刃而解。如果你后面还遇到 vben-admin 的构建、部署、权限或性能相关问题,这一套思路都很有用。希望这篇记录,能帮你节省至少半小时的排坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 423

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: MySql之事务详解
下一篇: Ai工具网站分享
小杨摆摆
博客等级 码龄4年 49粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值