MySQL 锁分类

MySQL 锁按锁粒度、锁模式、实现机制、并发思想四大维度划分,主流 InnoDB 引擎下核心锁类型如下:

一、按锁粒度(作用范围)

1. 全局锁(Global Lock)

  • 锁定整个数据库实例,所有表只读、不可写
  • 命令:FLUSH TABLES WITH READ LOCK(FTWRL)
  • 场景:全库逻辑备份、主从切换

2. 表级锁(Table Lock)

  • 锁定整张表,粒度大、开销小、并发低
  • 子类型:
    • 表读锁(共享):LOCK TABLES ... READ
    • 表写锁(排他):LOCK TABLES ... WRITE
    • 元数据锁(MDL):保护表结构,DDL/DML 自动加
    • 意向锁(IS/IX):InnoDB 表级意向,兼容行锁
  • 引擎:MyISAM、InnoDB(无索引时退化为表锁)

3. 行级锁(Row Lock)

  • 锁定单行,粒度最小、并发最高,InnoDB 核心
  • 依赖索引实现,无索引会全表加锁

4. 页级锁(Page Lock)

  • 锁定 16KB 数据页,仅 BDB 引擎(已淘汰)

二、按锁模式(读写兼容性)

1. 共享锁(S 锁 / 读锁)

  • 允许多事务读,阻塞写
  • 语法:SELECT ... LOCK IN SHARE MODE

2. 排他锁(X 锁 / 写锁)

  • 独占读写,阻塞其他 S/X 锁
  • 语法:SELECT ... FOR UPDATEINSERT/UPDATE/DELETE 自动加

三、InnoDB 行锁算法(解决幻读)

1. 记录锁(Record Lock)

  • 锁定单行索引记录,防更新/删除

2. 间隙锁(Gap Lock)

  • 锁定索引区间(不含记录),防插入

3. 临键锁(Next-Key Lock)

  • 记录锁 + 间隙锁,InnoDB 默认(RR 隔离级别),防幻读

4. 插入意向锁(Insert Intention Lock)

  • 间隙锁变种,多事务并发插入同一间隙不阻塞

四、特殊锁

1. 自增锁(AUTO-INC Lock)

  • 保证自增列唯一,批量插入时表级锁

2. 乐观锁(应用层)

  • 无数据库锁,用版本号/时间戳在更新时校验冲突

五、核心分类速览

维度 主要类型 核心引擎 特点
粒度 全局锁、表锁、行锁、页锁 全引擎、InnoDB/MyISAM、InnoDB、BDB 粒度越大并发越低
模式 共享锁(S)、排他锁(X) InnoDB 读共享、写互斥
行锁算法 记录锁、间隙锁、临键锁 InnoDB 解决幻读
思想 悲观锁(数据库)、乐观锁(应用) 全引擎 悲观加锁、乐观校验

什么是记录锁?

一、什么是 InnoDB 记录锁(Record Lock)

记录锁是 InnoDB 行锁的一种,锁定索引里的某一条具体记录(行),只锁住命中的单行,不锁间隙、不锁整张表。

前提:走精准索引匹配(唯一索引/主键等值查询),RR/RC 隔离级都生效。


二、核心特点

  1. 锁对象:索引物理行记录

    • InnoDB 行锁本质是「锁索引」,不是锁数据行
  2. 触发条件:等值精准命中唯一索引/主键,只锁定匹配到的那一行

  3. 兼容性

    • 记录 S 锁(共享):其他事务可读,阻塞写/删
    • 记录 X 锁(排他):其他事务读写都阻塞
  4. 无间隙锁定:只锁当前行,不会阻挡区间插入(和间隙锁/临键锁区分)


三、SQL 示例演示

表结构: