MySQL中的锁(全局锁、表锁和行锁)

devtools/2025/3/27 13:55:32/

锁的定义与作用

多用户环境下,当多个事务同时访问相同的数据时,可能会引发问题,锁就是用于协调多个线程并发访问数据库资源的机制,为了保证数据的一致性和准确性。

锁的类型

  1. 共享锁(Shared Lock/S Lock)

    • 用于读取操作(如 SELECT)。

    • 允许多事务同时持有,但阻止其他事务获取排他锁

  2. 排他锁(Exclusive Lock/X Lock)

    • 用于写入操作(如 UPDATEDELETE)。

    • 仅允许一个事务持有,其他事务无法获取任何类型的锁

  3. 意向锁(Intention Locks)

    • 意向共享锁(IS):事务计划在更细粒度(如行级)加共享锁。

    • 意向排他锁(IX):事务计划在更细粒度加排他锁。

    • 意向锁在表级设置,用于快速判断表中是否存在行级锁,避免逐行检查。

锁的粒度

全局锁:

1.定义:

针对整个数据库实例上的锁,加锁后该实例只允许读操作,对DDL(数据定义语言:定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等)和DML(数据操作语言:主要是对数据进行增加、删除、修改操作。常用的语句关键字有 INSERT、UPDATE、DELETE 等)只能阻塞等待锁释放。

2.使用场景:

数据库进行逻辑备份时,需要添加全局锁,避免出现备份期间,DDL和DML对数据库修改,导致数据出现不一致。

3.具体操作:

添加全局锁:

flash tables with read lock;

数据备份:

使用mysql提供的工具mysqldump,不是SQL语句,所以不能在>mysql输入,而是直接在命令行

mysqldump -u用户名 -p密码 备份sql路径

mysqldump -uroot -p123456 D:/db.sql

释放全局锁:

unlock tables

4.特点

添加全局锁后,增删改操作阻塞,业务基本停止;

使用InnoDB引擎,可以在备份参数添加--single-transaction参数来完成不加锁的一致性数据备份:

mysqldump --single-transaction -uroot -p123456 D:/db.sql

表级锁:

每次操作锁住整张表,锁的粒度大,发生锁冲突的概率最大,并发度最低。

表锁

1.定义

表共享读锁(read lock):允许当前客户端读,阻塞写;允许其他客户端读,阻塞写;

表共享写锁(write lock):允许当前客户端读和写;不允许其他客户端读和写。

2.语法
lock tables table1 read
lock tables table1 write

元数据锁(MDL)

元数据:描述数据的数据。在数据库中,元数据是指描述数据库对象(如表、列、索引等)结构的信息。

MDL加锁过程是系统控制,无法直接干预。

1.作用

维护表元数据的数据一致性,当表上有活动事务时,不允许对元数据进行修改操作。避免DML(数据操作语言)和DDL(数据定义语言)的冲突。

DML会申请MDL读锁(共享);DDL申请MDL写锁(排他)。

MDL读锁MDL写锁
MDL读锁允许阻塞
MDL写锁阻塞阻塞

意向锁

在添加表锁时,要先检测是否添加了行锁,所以就要检测每一行数据,非常的麻烦。

1.作用

意向锁可以解决这个问题,当添加行锁时,同时添加一个意向锁暴露出来,表锁就不需要遍历查找行锁了。

2.类型
表共享读锁表共享写锁
意向共享锁(IS)允许阻塞
意向排他锁(IX)阻塞阻塞

意向锁之间不互斥。 

行级锁

每次操作只锁住对应的行,锁的粒度小,发生锁冲突的概率低,并发度最高。

Innodb和myisam的一个差别就是锁。

默认情况下,Innodb在Repeatable Read(可重复读)事务隔离级别运行,Innodb使用next-key锁进行索引扫描,避免幻读。        

行锁(Record Lock)

1.定义:

锁住单行数据,防止其他事务对它进行update和delete操作。

2.使用:

对唯一索引进行检索时,对数据进行等值匹配时,自动优化为行锁;

Innodb的行锁是针对索引的,如果不使用索引查询条件,那么Innodb会对所有的数据加锁,则自动变成表锁。

间隙锁

1.定义

添加索引的数据不一定是连续的,比如id可以是1,2,5,9,88...

当给索引key的间隙加锁时,就是间隙锁。

比如,update ......where id = 7,就锁住了(5,9)

2.作用

不锁行数据,锁间隙有什么用,作用就是避免幻读,防止其他事务插入空隙。

我开启事务1,对id=9的行上行锁修改行数据,同时开启事务2,对id=7的行进行新增数据。

事务1:

update ......where id = 9;

事务2:

insert ......where id =7;

两个事务提交都会成功,就会出现幻读。

注意:间隙锁不互斥

临键锁

行锁+间隙锁

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

相关文章

盘泰UV种植体:抗老化新科技,焕发种植牙新活力

随着口腔健康意识的提升,越来越多的人选择种植牙来修复缺失牙齿。然而,种植牙并非一劳永逸,随着时间的推移,种植体也会像天然牙一样出现老化现象,影响种植牙的使用寿命和美观度。 盘泰UV种植体,创新采用紫…

AI鸟类识别技术革新生态监测:快瞳科技如何用“智慧之眼”守护自然?

在生态环境保护日益受关注的今天,“鸟类识别”已从专业科研工具演变为推动生态治理数字化的核心技术。无论是湿地保护区的珍稀候鸟监测,还是城市机场的鸟击风险预警,AI技术的精准赋能正在改写人类与自然的互动方式。作为行业领先的智能解决方…

使用Python构建去中心化预测市场:从概念到实现

使用Python构建去中心化预测市场:从概念到实现 大家好,我是Echo_Wish。今天,我们将深入探讨一个前沿的区块链应用——去中心化预测市场,并学习如何使用Python来构建一个简易的预测市场平台。预测市场是基于市场参与者对未来事件的预测来产生结果的地方,通常被用来预测政治…

FPGA设计中时间单位科普

FPGA设计中时间单位主要有秒s,毫秒ms,微秒us,纳秒ns,皮秒ps, 使用秒s作为单位时一定要谨慎,因为秒s对于FPGA来说是一个很大的单位。FPGA的时钟周期通常是20ns左右,1秒意味着需要等待50000000个…

奇瑞汽车智能化战略发布,开启“四大平权”新时代

3月18日,奇瑞汽车智能化战略发布会顺利召开。 据「TMT星球」了解,活动聚焦“油电同智 全球同行”,正式发布奇瑞集团智能化战略规划,并集中展示猎鹰智驾、人形机器人、智舱大模型等最新核心技术成果。 作为中国汽车智能化领域的先…

sql server2022安装教程

SQL Server 2022的安装过程相较于之前的版本有所改进,但基本步骤大体相似。以下是一个通用的SQL Server 2022安装教程指南: ### 准备工作 1. **系统要求**:确保您的计算机满足SQL Server 2022的最低系统要求,包括操作系统版本、处…

php 批量把数组中的日期时间转为时间戳

在PHP中,如果你想要将数组中的日期元素批量转换为时间戳,你可以使用strtotime()函数。这个函数可以将任何英文文本日期时间描述解析为Unix时间戳。 以下是一个简单的示例,说明如何实现这一功能: 示例1:使用strtotime…

Cursor/windsurf+MCP+Blender自动建模还有多远

试了下最近很火的MCP,刚好最近在琢磨参数化城市建模,想着能不能自动生成道路模型。 但因为最近claude也封号了,改成用cursor和windsurf也很方便 一、谈谈MCP理解 能够更好地让AI来完成自动化任务,感觉主要是解决2个问题 (1)数…