MySQL中的锁

article/2025/7/5 16:45:37

MySQL中有哪些锁?

全局锁(FTWRL)

含义:Flush Table with Read Lock的缩写,它会锁定整个数据库实例,让所有表都处于只读状态。

使用全局锁,要执行的命令:

flush tables with read lock

之后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞:

对数据增删改操作,比如insert,update,delete等语句;

对表结构的更改操作,比如alter table,drop table等语句。

insert into student(id,name,sex,birthday,class)values(110,'zz','男','1977-10-11','95034');

如果释放全局锁,则要执行这条命令:

unlock tables

应用场景:

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

缺点

加上全局锁后,整个库都是只读状态,备份耗时常,业务无法更新数据,导致业务停滞。

替代方式

支持可重复读隔离级别的引擎(如InnoDB),用mysqldump --single - transaction开启事务备份;不支持事务的引擎(如MylSAM)只能用全局锁。

数据库备份时,想要替代全局锁,关键在于利用事务特性和多版本并发控制(MVCC);

  • 原理基础:在可重复读隔离级别下,事务开启时会生成一个Read View(数据快照)。之后事务执行期间,都依据这个Read VIew去判断数据的可见性。即使其他事务在此期间对数据进行了修改并提交,基于这个Read View读取的数据依旧是事务开启时的状态,保证了数据的一致性。这就是MVCC的作用机制。
  • 操作方法:用mysqldump --single-transaction备份时,InnoDB 通过事务快照(可重复读隔离级别 + MVCC)固定数据版本,备份期间业务新操作生成独立版本,两者互不干扰,所以不用锁也能保证备份数据一致;MyISAM 不支持事务和 MVCC,只能用全局锁强制冻结数据。

表级锁

MySQL里面表级别的锁有这几种:

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

表锁

使用方法,对学生表加表锁,使用以下命令:

#对学生表加读锁
lock tables student read;#对学生表加写锁
lock tables student write;
#解开当前会话所有锁
unlock tables;
#查操作
select * from student;
#插入操作
insert into student(id,name,sex,birthday,class)values(111,'gzz','男','1977-10-11','95035');

加完读锁之后执行插入操作会造成以下现象(当前会话)

lock tables student read;(给student表加读锁 )

  • 当前会话限制:只能对student表执行读操作(如SELECT ) ,不能执行写操作(如INSERT、UPDATE、DELETE ) ,也不能对其他表进行读写操作。
  • 其他会话限制:能对student表执行读操作,但不能执行写操作,写操作会被阻塞,直到当前会话释放读锁 。

lock tables student write;(给student表加写锁 )

  • 当前会话权限:可对student表进行读和写操作 。
  • 其他会话限制:不能对student表进行读或写操作,读写操作都会被阻塞,直至写锁被释放 。 两种锁释放均用 unlock tables; 语句 ,且会话断开时锁也会自动释放。

释放表锁,使用unlock tables命令,则会释放当前会话的所有表锁;

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

在更细粒度锁出现前,表锁是处理并发常用手段。InnoDB 引擎场景下表锁弊端:InnoDB 引擎若使用表锁,因其锁粒度大(锁定整张表 ),会影响并发性能。比如多个事务要操作同表不同行数据,表锁会让其他事务等待,降低并发处理能力。InnoDB 优势:实现行级锁,锁粒度更细。仅锁定相关行数据,不同事务可同时操作同表不同行,极大提升数据库并发处理能力。

元数据锁

  • 加锁机制:操作数据库表时自动添加。执行 CRUD 操作加读锁;表结构变更时加写锁。
  • 功能作用:防止在对表进行操作期间,其他线程对表结构进行变更,保证数据操作的一致性。
  • 阻塞规则:读锁期间,阻止其他线程申请写锁;写锁期间,阻止其他线程申请读锁。
  • 释放时机:事务提交后释放,事务执行过程中一直持有。
  • 长事务影响:长事务持有读锁不提交,会阻碍表结构变更的写锁申请,进而阻塞后续 CRUD 操作,可能导致数据库线程资源紧张。
  • 应对措施:表结构变更前,排查并处理长事务。

意向锁

InnoDB 会在有人加「行锁」之前,先在表级别标记一个「我要锁某些行」的意向锁。这样当你想给整个表加锁时,只需看表上有没有这个标记,就能快速知道「表里面有没有行被锁住」,无需逐行检查。

  • 使用InnoDB引擎的表里对某些记录加上共享锁之前,需要先在表级别加上一个意向共享锁;
  • 使用InnoDB引擎的表里对某些记录加上独占锁之前,需要先在表级别加上一个意向独占锁;
与 select 关系

普通 select 靠 MVCC 实现一致性读,不加行级锁 。但 select ... lock in share mode 会先加意向共享锁,再给记录加共享锁;select ... for update 先加意向独占锁,再给记录加独占锁 。

冲突规则

意向共享锁和意向独占锁是表级锁 ,和行级共享锁、独占锁不冲突 ,意向锁之间也不冲突 ,只和共享表锁(lock tables ... read )、独占表锁(lock tables ... write )冲突 。表锁和行锁满足 “读读共享、读写互斥、写写互斥” 。

作用原理

没意向锁时,加独占表锁得遍历全表看有无记录加独占锁,效率低 。有了意向锁,加独占锁前先加意向独占锁,加独占表锁时,查看有无意向独占锁,就能快速判断表里记录是否被加锁 。

意向锁是表级的「占位符」,用来快速告诉你表中是否有行已被锁定,避免全表扫描。

AUTO-INC锁

表里的主键通常会设置为自增的,这是通过对主键字段声明AUTO-INCREMENT属性实现。

之后可以在插入数据时,可以不指定主键的值,数据库会自动给主键赋值递增的值,这主要时通过AUTO-INC锁实现的。

用途:用于实现数据库表主键等字段自增 。插入数据时,数据库利用它自动给被AUTO_INCREMENT 修饰字段赋递增的值 。

锁机制:是特殊表锁 ,执行完插入语句立即释放 ,非事务提交后释放 。持有锁时,阻塞其他事务插入 ,确保自增值连续递增 ,但影响大量数据插入性能 。

改进:MySQL 5.1.22 起,InnoDB 引入轻量级锁 。通过innodb_autoinc_lock_mode 控制 :

= 0 ,用 AUTO - INC 锁,语句执行完释放 。

= 1 ,普通insert 申请后即释放,insert ... select 等批量插入语句结束后释放 。

= 2 ,用轻量级锁,申请自增主键后就释放 ,性能高,但搭配statement 格式binlog 用于主从复制时会有数据不一致问题 。

行级锁

InnoDB引擎是支持行级锁的,而MylSAM引擎并不支持行级锁。

在查询时对记录加行锁,可以使用这下面两个方式,这种查询会加锁的语句称为锁定读。

#对读取的记录加共享锁
select ... lock in share mode#对读取的记录加独占占领
select ... for update

上面这两条语句必须在一个事务中,因为当事务提交了,所就会被释放,所以在使用这两条语句的时候,要加上begin、start transaction或者set autocommit = 0。

共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。

行级锁的主要有三类:

  • Record Lock,记录锁,也就是仅仅把一条记录锁上;
  • Grap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
  • Next-Key Lock:Record Lock+ Grap Lock的组合,锁定一个范围,并且锁定记录本身。

Record Lock(记录锁)

含义:针对数据库表中某一条具体记录进行加锁。例如在含有主键 id 的表中,使用 SELECT * FROM table WHERE id = 1 FOR UPDATE; 语句,就会对 id 为 1 的这条记录添加记录锁,其他事务不能对该记录执行修改、删除等操作 。
作用:保障单条记录在被操作过程中的完整性与一致性,有效避免因多个事务并发修改同一条记录而产生的数据问题 。

Gap Lock(间隙锁)

含义:锁定的是数据库表中记录之间的间隙范围,并不包含记录本身。比如表中存在记录 id 为 13 ,那么 1 和 3 之间的间隙就能够被间隙锁锁定。当对这个间隙加锁后,若有插入 id 为 2 记录的操作,会因涉及到已锁定的间隙范围而被阻塞 。
作用:主要用于阻止在锁定的间隙范围内插入新记录,防止因新记录的插入导致数据逻辑出现混乱,是应对幻读问题的常用手段 。

Next - Key Lock(临键锁)

含义:它是记录锁与间隙锁的组合形式。不仅会锁定某条特定记录,还会将该记录前后的间隙范围一并锁定。举例来说,若对 id 为 3 的记录添加临键锁,那么 id 为 3 的这条记录本身以及其前后的间隙范围都会被锁定,新记录无法插入到这个被锁定的范围之内 。
作用:在确保单条记录操作安全性的同时,也能防止因在相关范围内插入新记录而引发的数据不一致问题,是 InnoDB 默认的行锁算法,在防止幻读方面效果显著 。


http://www.hkcw.cn/article/dmflyiMxlZ.shtml

相关文章

探索 Dify 的工作流:构建智能应用的新范式

目录 前言1. 什么是 Dify 的工作流2. 工作流的核心组成2.1 节点(Node)2.2 连接线(Edge)2.3 上下文与变量系统 3. 工作流的典型使用场景3.1 多轮对话与智能客服3.2 文档问答系统3.3 多语言营销文案生成3.4 多模型对比与评估&#x…

分词算法BBPE详解和Qwen的应用

一、TL;DR BPE有什么问题:依旧会遇到OOV问题,并且中文、日文这些大词汇表模型容易出现训练中未出现过的字符Byte-level BPE怎么解决:与BPE一样是高频字节进行合并,但BBPE是以UTF-8编码UTF-8编码字节序列而非字符序列B…

小云天气APP:精准预报,贴心服务

在快节奏的现代生活中,天气变化对我们的日常生活、出行安排以及健康状况都有着重要影响。一款精准、便捷且功能丰富的天气预报应用,无疑是提升生活品质的必备工具。小云天气APP正是这样一款为安卓用户量身定制的天气预报应用,凭借其精准的天气…

阿里云服务器ECS详细购买流程

1、打开云服务器ECS官方页面 打开阿里云服务器ECS页面 点击进入阿里云服务器 2、付费类型选择 阿里云服务器付费类型 3、地域节点 阿里云服务器全球28个地域,中国大陆地域如华北2(北京)、华东1(杭州)、华南1&#xf…

FastAPI+Pyomo实现线性回归解决饮食问题

之前在 FastAPI介绍-CSDN博客 中介绍过FastAPI,在 Pyomo中线性规划接口的使用-CSDN博客 中使用Pyomo解决饮食问题,这里将两者组合,即FastAPI在服务器端启动,通过Pyomo实现线性回归;客户端通过浏览器获取饮食的最优解。…

【C++篇】STL适配器(上篇):栈与队列的底层(deque)奥秘

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C感兴趣的…

leetcode刷题日记——二叉树的层次遍历

[ 题目描述 ]: [ 思路 ]: BFS,利用队列特性完成对树的层次遍历运行如下 int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {if (!root) {*returnSize 0;return NULL;}struct TreeNode* queue[2000];…

【优选算法 | 队列 BFS】构建搜索流程的核心思维

算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”,但为什么一定是队列?它到底在整个搜索流程中起了什么作…

Retrievers检索器+RAG文档助手项目实战

导读:作为企业级应用开发中的关键技术,LangChain检索器(Retrievers)正成为构建高效RAG系统的核心组件。本文将深入探讨检索器的技术架构与实战应用,帮助开发者掌握这一重要的AI工程技术。 检索器的价值在于提供统一的检…

word中如何快速调整全部表格大小

Step1: 选中一个表格,然后在自动调整选项卡中选择“根据窗口调整表格大小” Step2:选中其他表格 Step3: 按F4即可快速调整

设计模式——中介者设计模式(行为型)

摘要 文章详细介绍了中介者设计模式,这是一种行为型设计模式,通过中介者对象封装多个对象间的交互,降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景,并通过类图、时序图、实现方式、实战示例等多方面进行讲解&#xff0…

20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s

20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s 2025/6/2 18:15 缘起:有些时候,需要在uboot阶段做一些事情。 于是,希望在荣品的PRO-RK3566开发板的Android13下的uboot启动停下。 1、【原始的LOG&#xff…

汽车安全体系:FuSa、SOTIF、Cybersecurity 从理论到实战

汽车安全:功能安全(FuSa)、预期功能安全(SOTIF)与网络安全(Cybersecurity) 从理论到实战的安全体系 引言:自动驾驶浪潮下的安全挑战 随着自动驾驶技术从L2向L4快速演进,汽车安全正从“机械可靠…

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文(尤其是计算机视觉、深度学习领域)中是重要的可视化分析工具和论证辅助手段,可以给论文加分不少。主要作用一是增强论文的可解释性与说服力:论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…

C++ 检查一条线是否与圆接触或相交(Check if a line touches or intersects a circle)

给定一个圆的圆心坐标、半径 > 1 的圆心坐标以及一条直线的方程。任务是检查给定的直线是否与圆相交。有三种可能性: 1、线与圆相交。 2、线与圆相切。 3、线在圆外。 注意:直线的一般方程是 a*x b*y c 0,因此输入中只给出常数 a、b、…

判断用户输入昵称是否存在(Python)

一、运行结果 二、源代码 # 创建一个存储昵称的列表; name_list [章鱼, 张愚, 宇文弑]# 循环输入判断用户输入昵称是否存在 while True:# 获取用户输入的昵称;name input(请输入昵称:)# 判断昵称是否存在;if name in name_list…

RAG理论基础总结

目录 概念 流程 文档收集和切割 读取文档 转换文档 写入文档 向量转换和存储 搜索请求构建 向量存储工作原理 向量数据库 文档过滤和检索 检索前 检索 检索后 查询增强和关联 QuestionAnswerAdvisor查询增强 高级RAG架构 自纠错 RAG(C-RAG&#xf…

pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X

目录 一、XSS 二、DOM型XSS 三、源码分析 1、打开DOM-X型XSS关卡 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 五、DOM型XSS与DOM-X型XSS区别 本系列为通过《pikachu靶场通关笔记》的XSS攻击关卡(共10关)渗透集合&#xf…

3. TypeScript 中的数据类型

在 TypeScript 中,类型(Types)允许你定义并强制执行应用中数据的结构。通过使用类型,你可以在编译阶段捕捉错误,而不是等到运行时才发现,从而让代码更加可预测,也更不容易出现 bug。TypeScript …

【Java Web】速通Tomcat

参考笔记:JavaWeb 速通Tomcat_tomcat部署java项目-CSDN博客 目录 一、Tomcat服务 1. 下载和安装 2. 启动Tomcat服务 3. 启动Tomcat服务的注意事项 4. 关闭Tomcat服务 二、Tomcat的目录结构 1. bin 🌟 2. conf 🌟 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web项目…