MySQL 锁的完整分类与详解

 更新时间:2026年02月28日 10:54:22   作者:是码龙不是码农  
MySQL中的锁可以从锁粒度、锁类型、锁状态三个维度划分,下面按 “粒度 + 类型” 的逻辑体系,逐一说明所有核心锁的定义、作用和使用场景,对mysql锁分类相关知识感兴趣的朋友跟随小编一起看看吧

MySQL 中的锁可以从锁粒度锁类型锁状态三个维度划分,下面按 “粒度 + 类型” 的逻辑体系,逐一说明所有核心锁的定义、作用和使用场景:

一、按锁粒度划分(核心分类)

锁粒度决定了锁的影响范围,粒度越小,并发度越高,但锁管理开销越大。

1. 全局锁

  • 定义:锁定整个 MySQL 实例,是粒度最大的锁。
  • 作用:保证整个实例的数据一致性,防止数据被修改。
  • 具体实现FLUSH TABLES WITH READ LOCK (FTWRL)
  • 使用场景
    • 全库逻辑备份(避免备份过程中数据被修改);
    • 跨库事务一致性读取(极少用,因为会阻塞所有写操作)。
  • 注意:加全局锁后,所有库的所有表都只能读,写操作(增删改、DDL)全部阻塞;解锁用UNLOCK TABLES

2. 表级锁

锁定整张表,粒度比全局锁小,开销小、加锁快,但并发度低。MySQL 中表级锁分为两类:

表格

锁类型定义作用适用场景
表读锁(READ)共享锁(S 锁)加锁后,自己和其他会话都能读表,所有会话都不能写表只读操作(如批量查询)
表写锁(WRITE)排他锁(X 锁)加锁后,只有自己能读写表,其他会话既不能读也不能写批量修改表数据(如全表更新)
元数据锁(MDL)隐式加锁(无需手动)保护表结构(元数据)不被修改,DDL 操作会加 MDL 写锁,DML / 查询加 MDL 读锁防止查询时表结构被修改
意向锁(IS/IX)表级的 “标记锁”表示 “某个事务准备给表中的行加锁”,避免行锁和表锁冲突配合行锁使用(自动加锁)

1.意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。

2.意向排他锁(IX):与表锁共享锁(read)及排他锁(write)都互斥。意向锁之间不会互斥。

手动加表锁命令

LOCK TABLES table_name READ;  -- 加读锁
LOCK TABLES table_name WRITE; -- 加写锁
UNLOCK TABLES;                -- 解锁

3. 行级锁

锁定表中的单行数据,粒度最小,并发度最高,但加锁开销大(InnoDB 引擎特有,MyISAM 不支持)。

锁类型定义作用
行共享锁(S 锁)事务对行加 S 锁后,其他事务可加 S 锁(共享读),但不能加 X 锁(排他写)允许并发读,防止读时被修改(如SELECT ... LOCK IN SHARE MODE
行排他锁(X 锁)事务对行加 X 锁后,其他事务既不能加 S 锁也不能加 X 锁保证修改 / 删除时数据独占,防止并发修改(如UPDATE/DELETE/INSERT
间隙锁(Gap Lock)锁定索引记录之间的 “间隙”(不包含记录本身),防止插入新数据解决幻读问题(RR 隔离级别下自动生效)
临键锁(Next-Key Lock)行锁 + 间隙锁的组合,锁定 “记录 + 记录前的间隙”,是 InnoDB 默认的行锁方式同时防止幻读、不可重复读(RR 隔离级别下核心锁)
插入意向锁(Insert Intention Lock)多个事务插入同一间隙时的 “意向锁”,互不阻塞提升并发插入效率(如多个事务插入不同行到同一间隙)
自增锁(AUTO-INC Lock)针对自增列的表级锁,保证自增 ID 连续唯一防止自增 ID 重复(可通过innodb_autoinc_lock_mode调整锁粒度)

行锁示例

-- 加行共享锁(S锁)
SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;
-- 加行排他锁(X锁)
SELECT * FROM user WHERE id=1 FOR UPDATE;
-- 普通DML自动加X锁
UPDATE user SET name='test' WHERE id=1;

二、按锁属性补充分类

除了粒度,还可按 “锁的竞争关系” 划分:

  1. 共享锁(S 锁):多事务共享读权限,互斥写权限(如行 S 锁、表读锁);
  2. 排他锁(X 锁):独占读写权限,其他事务无法加任何锁(如行 X 锁、表写锁);
  3. 意向锁(IS/IX):表级的 “预告锁”,IS = 意向共享(准备加行 S 锁),IX = 意向排他(准备加行 X 锁),仅用于判断表锁和行锁的冲突,无需手动操作。

三、特殊场景的锁

  1. 页锁:锁定数据页(InnoDB 的存储结构,一页约 16KB),粒度介于行锁和表锁之间,MySQL 极少单独使用,仅 InnoDB 内部优化时用到;
  2. 死锁:并非 “锁类型”,而是多事务互相持有对方需要的锁导致的阻塞状态,MySQL 会自动检测并回滚其中一个事务解决。

总结

  1. 核心锁粒度:全局锁(整实例)> 表级锁(整表)> 行级锁(单行),粒度越小并发越高、开销越大;
  2. 核心锁类型:共享锁(S)和排他锁(X)是基础,间隙锁 / 临键锁是 InnoDB 解决幻读的核心,MDL 锁保护表结构;
  3. 引擎差异:MyISAM 仅支持表级锁,InnoDB 支持行级锁 + 表级锁,行锁是 InnoDB 保证事务 ACID 的核心。

关键点:日常开发中,90% 的场景关注行级锁(X/S/ 临键锁)MDL 锁 即可,全局锁仅用于备份,表级锁尽量避免(会降低并发)。

到此这篇关于MySQL 锁的完整分类与详解的文章就介绍到这了,更多相关mysql锁分类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库迁移后无法启动的问题解决

    MySQL数据库迁移后无法启动的问题解决

    本文主要介绍了MySQL数据库迁移后无法启动的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2025-06-06
  • 深入解析MySQL中的Redo Log、Undo Log和Binlog

    深入解析MySQL中的Redo Log、Undo Log和Binlog

    本文详细介绍了MySQL中的RedoLog、UndoLog和Binlog的背景、业务场景、功能、底层实现原理以及使用措施,通过Java代码示例展示了如何与这些日志进行交互,进一步深化了对MySQL日志系统的理解,理解并合理使用这些日志,可以有效地提升数据库的性能和可靠性
    2024-10-10
  • MySQL教程彻底学懂存储过程

    MySQL教程彻底学懂存储过程

    这篇文章主要为大家介绍了MySQL系列的存储过程,文中详细的为大家解释存储过程的相关概念及用法语法,以及对存储过程的理解解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • MySQL视图原理与基本操作示例

    MySQL视图原理与基本操作示例

    这篇文章主要介绍了MySQL视图原理与基本操作,简单描述了mysql视图的概念、功能并结合实例形式分析了mysql视图的创建、查询、修改、删除等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • MySQL数据库配置优化的方案

    MySQL数据库配置优化的方案

    我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的。本文讲解MySQL在各个方面的优化方向,方便后端开发人员在调优和问题排查过程中找到切入点
    2023-02-02
  • mysql创建时间字段添加默认值方式

    mysql创建时间字段添加默认值方式

    这篇文章主要介绍了mysql创建时间字段添加默认值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • MySQL5.7的安装与配置详细操作步骤

    MySQL5.7的安装与配置详细操作步骤

    本文分步骤详细给大家介绍了MySQL5.7的安装与配置详细操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • mysqldump备份数据库时排除某些库的实例

    mysqldump备份数据库时排除某些库的实例

    下面小编就为大家带来一篇mysqldump备份数据库时排除某些库的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL如何给查出的数据加上序号(最新整理)

    MySQL如何给查出的数据加上序号(最新整理)

    这篇文章主要介绍了MySQL如何给查出的数据加上序号,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • MySQL导致索引失效的几种情况

    MySQL导致索引失效的几种情况

    本文主要介绍了MySQL导致索引失效的几种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论