news 2026/3/29 6:50:04

MySQL 中锁的概念分类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 中锁的概念分类

一、MySQL 中锁的核心概念

锁是数据库用于控制并发访问共享资源的机制,目的是保证事务的隔离性数据一致性,防止多个事务同时修改同一数据导致脏写、脏读等问题。MySQL 的锁机制因存储引擎而异(如 MyISAM 仅支持表锁,InnoDB 支持行锁 + 表锁),其中 InnoDB 的锁体系最复杂也最核心。

二、MySQL 锁的分类(按核心维度)

1. 按锁的粒度(最核心分类)

锁粒度越小,并发度越高,但加锁开销越大、越易出现死锁。

锁类型粒度支持引擎特点典型场景
全局锁整个数据库所有引擎阻塞所有写操作(读正常),加锁快、开销小;并发度极低全库逻辑备份(FTWRL)、主从同步
表级锁整张表MyISAM/InnoDB加锁快、无死锁;锁粒度大,并发度低MyISAM 写操作、InnoDB MDL 锁
行级锁单行记录InnoDB(独有)锁粒度细、并发度高;加锁慢、开销大,可能死锁;基于索引加锁(无索引升级为表锁)InnoDB 并发写操作
(1)全局锁
  • 加锁方式:FLUSH TABLES WITH READ LOCK (FTWRL)
  • 释放方式:UNLOCK TABLES或会话断开
  • 注意:与SET GLOBAL read_only=1区别 ——read_only 对超级用户无效,FTWRL 对所有用户生效。
(2)表级锁细分
  • 表锁:手动加锁(LOCK TABLES t1 READ/WRITE),读锁共享(多个事务可加),写锁排他(仅一个事务可加)。
  • 元数据锁(MDL):自动加锁(访问表时触发),保证表结构不被并发修改。读操作加 MDL 读锁(共享),ALTER TABLE 加 MDL 写锁(排他)。长事务持有 MDL 读锁会阻塞 ALTER TABLE,是生产中常见卡死场景。
(3)行级锁(InnoDB 核心)

依赖索引实现,无索引时会升级为表锁,核心变体如下:

行锁类型作用适用场景
记录锁(Record Lock)锁定索引上的具体行记录(如WHERE id=10,仅锁 id=10 行)精准匹配单行的更新 / 查询
间隙锁(Gap Lock)锁定索引记录之间的间隙(不包含记录本身,如 id=1、3、5,锁 (3,5) 间隙)防止幻读(RR 级别下生效)
Next-Key Lock记录锁 + 间隙锁(锁定索引记录 + 前面的间隙,如 id=3,锁 (1,3])InnoDB RR 级别默认行锁方式
插入意向锁间隙锁的特例,多个事务插入同一间隙的不同记录时互不阻塞(如间隙 (3,5) 插 4 和 6)提升插入并发度
2. 按锁的读写属性(共享 / 排他)
锁类型别名兼容性(与其他锁)加锁方式
共享锁(S 锁)读锁与 S 锁兼容,与 X 锁互斥手动:SELECT ... LOCK IN SHARE MODE;自动:无(仅显式加)
排他锁(X 锁)写锁与 S/X 锁均互斥自动:UPDATE/DELETE/INSERT;手动:SELECT ... FOR UPDATE
3. 意向锁(InnoDB 表级锁,辅助行锁)

为了快速判断表中是否有行锁,减少表锁检查的开销,分为:

  • 意向共享锁(IS):事务想给某行加 S 锁,先给表加 IS 锁;
  • 意向排他锁(IX):事务想给某行加 X 锁,先给表加 IX 锁。
  • 兼容性规则:IS 与 IS/IX 兼容,IX 与 IX 兼容;IS/IX 与表级 S 锁:IS 兼容、IX 不兼容;IS/IX 与表级 X 锁均不兼容。
4. 乐观锁 vs 悲观锁(逻辑分类)
  • 悲观锁:数据库原生锁(S/X 锁),假设并发冲突必然发生,加锁阻止其他事务操作(如SELECT ... FOR UPDATE);
  • 乐观锁:应用层实现(版本号 / 时间戳),假设冲突少,更新时检查版本(如UPDATE t SET val=1 WHERE id=1 AND version=2),不通过则重试。

三、SQL 标准的四种隔离级别及 InnoDB 实现

首先明确并发访问的三大问题:

  • 脏读:读取其他事务未提交的修改(数据可能回滚,无效);
  • 不可重复读:同一事务多次读同一数据,其他事务修改并提交,结果不一致;
  • 幻读:同一事务按条件查询,其他事务插入符合条件的新数据,查询结果多了 “幻影” 行。

InnoDB 通过MVCC(多版本并发控制)+ 锁机制实现隔离级别,核心组件:

  • 版本链:每行隐藏列DB_TRX_ID(最后修改事务 ID)、DB_ROLL_PTR(指向 undo log 的版本链);
  • Undo Log:保存数据历史版本,用于 MVCC 读取和事务回滚;
  • Read View:事务的 “一致性视图”,定义了该事务能看到的版本范围。
1. 读未提交(Read Uncommitted, RU)
  • 定义:事务可读取其他事务未提交的数据;
  • 并发问题:脏读、不可重复读、幻读都存在;
  • InnoDB 实现:无 MVCC 参与,读操作直接读取最新的内存 / 磁盘数据(不加任何锁),写操作加 X 锁但不阻塞读。性能最高,但一致性最差,几乎不使用。
2. 读已提交(Read Committed, RC)
  • 定义:事务仅能读取其他事务已提交的数据;
  • 并发问题:解决脏读,仍存在不可重复读、幻读;
  • InnoDB 实现:核心是MVCC(动态 Read View) + 行级记录锁
    • Read View:每次执行 SELECT 时生成新的 Read View,确保只能看到已提交的最新版本,解决脏读;但多次读的 View 不同,导致不可重复读;
    • 锁机制:禁用间隙锁(仅外键 / 唯一性检查时生效),行锁仅为记录锁(提升并发);写操作加 X 锁至事务提交,普通 SELECT 为 “快照读”(不加锁),显式读(FOR UPDATE)加 X 锁。
    • 备注:MySQL 默认隔离级别为 RR,Oracle 默认是 RC。
3. 可重复读(Repeatable Read, RR)
  • 定义:同一事务内多次读取同一数据,结果始终一致;
  • 并发问题:解决脏读、不可重复读;InnoDB 额外解决了幻读(SQL 标准中 RR 仍有幻读);
  • InnoDB 实现:核心是MVCC(静态 Read View) + Next-Key Lock
    • Read View:事务第一次 SELECT 时生成,全程复用,确保多次读同一版本,解决不可重复读;
    • Next-Key Lock:默认行锁方式(记录锁 + 间隙锁),锁定索引记录 + 间隙,阻止其他事务插入符合条件的新数据,解决幻读;
      • 优化:若查询使用唯一索引(主键 / 唯一键)且匹配单行,Next-Key Lock 降级为记录锁(减少锁粒度);
    • 锁机制:写操作加 X 锁至提交,普通 SELECT 为快照读,显式读加 S/X 锁。
4. 串行化(Serializable, S)
  • 定义:最高隔离级别,所有事务串行执行;
  • 并发问题:解决所有问题(脏读、不可重复读、幻读);
  • InnoDB 实现:禁用 MVCC,所有读操作(普通 SELECT)变为 “当前读” 并隐式加 S 锁,写操作加 X 锁:
    • 事务 A 的 SELECT 会锁定所有符合条件的行和间隙,事务 B 的写操作会被阻塞,直到 A 提交;
    • 多个事务的读操作可并行(S 锁共享),但读与写、写与写互斥,最终事务串行执行;
    • 性能最差,仅适用于数据一致性要求极高的场景(如金融核心交易)。

四、隔离级别与锁 / MVCC 对应表

隔离级别解决的问题MVCC 使用锁机制
读未提交不使用写加 X 锁,读不加锁
读已提交脏读动态 Read View(每次读生成)记录锁,禁用间隙锁
可重复读脏读、不可重复读、幻读静态 Read View(首次读生成)Next-Key Lock(默认)
串行化所有问题不使用读加 S 锁,写加 X 锁,串行执行

总结

  1. InnoDB 的锁体系以行锁为核心,通过意向锁、Next-Key Lock 等优化锁粒度和检查效率;
  2. 隔离级别本质是 “一致性” 与 “并发度” 的权衡,RR 是 MySQL 默认级别,兼顾一致性和性能;
  3. MVCC 是 InnoDB 实现 RC/RR 的核心,通过版本链和 Read View 避免加锁读,提升并发;锁机制则解决写冲突和幻读问题。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 16:41:56

EmotiVoice与语音唤醒技术结合的智能家居场景设想

EmotiVoice与语音唤醒技术结合的智能家居场景设想 在智能家居设备日益复杂的今天,用户早已不再满足于“能听会说”的机械式语音助手。他们期待的是一个真正懂情绪、有温度、像家人一样自然交流的伙伴。然而现实是,大多数语音系统仍停留在冰冷的标准音输出…

作者头像 李华
网站建设 2026/3/27 9:19:37

CS50 Week 3 Notes

本周主题: 搜索算法:线性搜索(Linear Search)、二分查找(Binary Search)排序算法:冒泡排序(Bubble Sort)、选择排序(Selection Sort)、归并排序&…

作者头像 李华
网站建设 2026/3/28 17:32:11

AI如何帮你高效使用ctx.drawImage绘制复杂图形

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个使用ctx.drawImage绘制复杂图形的Canvas应用。应用需要包含以下功能:1. 自动生成绘制多张图片的代码,支持图片叠加和位置调整;2. 提供参…

作者头像 李华
网站建设 2026/3/27 7:14:22

真实案例:忘记密码锁密码后的5种解决方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个密码锁应急解决方案查询工具,输入密码锁品牌和型号,自动返回该锁的常见解锁方法、厂家联系方式、备用钥匙位置等信息。支持用户上传锁具照片进行智能…

作者头像 李华
网站建设 2026/3/27 9:46:18

快速验证:用R语言原型化下载服务创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个R语言原型项目,实现:1)简易REST API接口接收下载请求;2)支持多种下载协议(http/ftp/sftp);3)下载队列管理;4…

作者头像 李华
网站建设 2026/3/14 6:19:03

ADB实战:5个提升效率的自动化调试场景

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个ADB场景化工具箱,包含:1) 多设备并行操作模块 2) 自动化测试脚本生成器(支持Monkey测试) 3) 崩溃日志分析仪表盘 4) 无线调试配置向导 5) 应用性能监…

作者头像 李华