news 2026/5/1 6:18:29

Mysql锁机制与优化实践以及MVCC底层原理剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mysql锁机制与优化实践以及MVCC底层原理剖析

一、锁机制详解

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

二、锁分类

  • 从性能上分为乐观锁(用版本对比或CAS机制)和悲观锁,乐观锁适合读操作较多的场景,悲观锁适合写操作较多的场景,如果在写操作较多的场景使用乐观锁会导致比对次数过多,影响性能
  • 从对数据操作的粒度分,分为表锁、页锁、行锁
  • 从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁),还有意向锁

1. 读锁(共享锁,S锁(Shared))

针对同一份数据,多个读操作可以同时进行而不会互相影响,比如:

select * from T where id=1 lock in share mode;

2. 写锁(排它锁,X锁(eXclusive))

当前写操作没有完成前,它会阻断其他写锁和读锁,数据修改操作都会加写锁,查询也可以通过for update加写锁,比如:

select * from T where id=1 for update;

3. 意向锁(Intention Lock)

又称I锁,针对表锁,主要是为了提高加表锁的效率,是mysql数据库自己加的。当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。特别是表中的记录很多时,逐行判断加表锁的方式效率很低。而这个标识就是意向锁。

意向锁主要分为:

  • 意向共享锁,IS锁,对整个表加共享锁之前,需要先获取到意向共享锁。
  • 意向排他锁,IX锁,对整个表加排他锁之前,需要先获取到意向排他锁。

4. 表锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

--建表SQL CREATE TABLE `mylock` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `NAME` VARCHAR (20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = MyISAM DEFAULT CHARSET = utf8; --插入数据 INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('1', 'a'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('2', 'b'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('3', 'c'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('4', 'd');
--手动增加表锁 lock table 表名称 read(write),表名称2 read(write); --查看表上加过的锁 show open tables; --删除表锁 unlock tables;

5. 页锁

只有BDB存储引擎支持页锁,页锁就是在页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。页锁的开销介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,并发度一般。

6. 行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

InnoDB相对于MYISAM的最大不同有两点:

  • InnoDB支持事务(TRANSACTION)
  • InnoDB支持行级锁

注意,InnoDB的行锁实际上是针对索引加的锁(在索引对应的索引项上做标记),不是针对整个行记录加的锁。并且该索引不能失效,否则会从行锁升级为表锁。(RR级别会升级为表锁,RC级别不会升级为表锁)

比如我们在RR级别执行如下sql

--where条件里的name字段无索引 select * from account where name = 'lilei' for update;

则其它Session对该表任意一行记录做修改操作都会被阻塞住。

PS:关于RR级别行锁升级为表锁的原因分析

因为在RR隔离级别下,需要解决不可重复读和幻读问题,所以在遍历扫描聚集索引记录时,为了防止扫描过的索引被其它事务修改(不可重复读问题) 或 间隙被其它事务插入记录(幻读问题),从而导致数据不一致,所以MySQL的解决方案就是把所有扫描过的索引记录和间隙都锁上,这里要注意,并不是直接将整张表加表锁,因为不一定能加上表锁,可能会有其它事务锁住了表里的其它行记录。

7. 间隙锁(Gap Lock)

间隙锁,锁的就是两个值之间的空隙,间隙锁是在可重复读隔离级别下才会生效

上次讲过,Mysql默认级别是repeatable-read,有幻读问题,间隙锁是可以解决幻读问题的。

假设account表里数据如下:

那么间隙就有 id 为 (3,10),(10,20),(20,正无穷) 这三个区间,在Session_1下面执行如下sql:

select * from account where id = 18 for update;

则其他Session没法在这个(10,20)这个间隙范围里插入任何数据。

如果执行下面这条sql:

select * from account where id = 25 for update;

则其他Session没法在这个(20,正无穷)这个间隙范围里插入任何数据。

也就是说,只要在间隙范围内锁了一条不存在的记录会锁住整个间隙范围,不锁边界记录,这样就能防止其它Session在这个间隙范围内插入数据,就解决了可重复读隔离级别的幻读问题。

8. 临键锁(Next-key Locks)

Next-Key Locks是行锁与间隙锁的组合。

9. 总结:

  • MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。
  • InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。
  • 另外,读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
  • Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比就会有比较明显的优势了。
  • 但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

今天先写到这里,明天继续!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:18:25

unet person image cartoon compound vs 其他人像模型:性能对比评测教程

unet person image cartoon compound vs 其他人像模型:性能对比评测教程 1. 选型背景与评测目标 在人像卡通化这一细分领域,随着深度学习技术的快速发展,涌现出多种基于生成对抗网络(GAN)和U-Net架构的图像风格迁移方…

作者头像 李华
网站建设 2026/4/29 5:40:08

ms-swift最佳实践:学习率与batch size设置建议

ms-swift最佳实践:学习率与batch size设置建议 在大模型微调实践中,超参数的选择直接决定了训练效率和最终性能。尽管ms-swift框架通过集成LoRA、QLoRA等轻量微调技术显著降低了资源门槛,但若学习率(learning rate)和…

作者头像 李华
网站建设 2026/4/15 0:40:27

MGeo模型快速入门:中文地址对齐的零基础部署教程

MGeo模型快速入门:中文地址对齐的零基础部署教程 在地理信息处理、用户画像构建和城市计算等场景中,地址相似度匹配是一项关键任务。由于中文地址存在表述多样、缩写习惯差异、行政区划嵌套复杂等问题,传统字符串匹配方法(如编辑…

作者头像 李华
网站建设 2026/4/12 17:51:57

YOLO11 vs Faster R-CNN:工业场景下性能全面对比

YOLO11 vs Faster R-CNN:工业场景下性能全面对比 1. 工业目标检测的技术选型背景 在智能制造、自动化质检、仓储物流等工业应用场景中,目标检测技术正扮演着越来越关键的角色。从零部件缺陷识别到产线异物监测,实时性、准确率和部署成本成为…

作者头像 李华
网站建设 2026/4/29 0:20:03

从文本到情感化语音|深度体验Voice Sculptor指令合成黑科技

从文本到情感化语音|深度体验Voice Sculptor指令合成黑科技 1. 引言:语音合成进入“可编程”时代 传统语音合成系统往往局限于固定音色、单一语调,用户只能被动接受预设的声音输出。然而,随着大模型与语音技术的深度融合&#x…

作者头像 李华