数据库死锁(MySQL 锁到底有哪些?一张表搞懂所有锁,再也不懵)

数据库死锁(MySQL 锁到底有哪些?一张表搞懂所有锁,再也不懵)
MySQL 锁到底有哪些?一张表搞懂所有锁,再也不懵

只要做后端、高并发、事务,MySQL 锁就是绕不开的高频考点 + 踩坑重灾区

死锁、锁等待、并发卡顿、更新错乱,90% 都是没弄懂锁的类型。

这篇用人话把 MySQL 所有锁一次性讲清,不绕、不晦涩。


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

1. 全局锁

锁住整个数据库实例,整个库只能读,不能写。

  • 场景:全库备份
  • 特点:粒度最大,并发极差

2. 表级锁

锁住整张表,其他事务不能读写。

  • 优点:加锁快、无死锁
  • 缺点:并发性能差
  • MyISAM 默认、InnoDB 也会出现

3. 行级锁

只锁住某一行数据,其他行不受影响。

  • 优点:并发极高
  • 缺点:加锁慢,可能出现死锁
  • InnoDB 最常用

二、按操作性质划分

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

  • 允许多个事务同时加读锁
  • 加了读锁,不能加写锁
  • 语法:SELECT ... LOCK IN SHARE MODE

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

  • 只有一个事务能持有
  • 加了写锁,其他读写都阻塞
  • 增删改默认自动加排他锁
  • 语法:SELECT ... FOR UPDATE

三、按实现机制划分(InnoDB 重点)

1. 记录锁(Record Lock)

锁住某一行具体记录,锁住索引记录。

2. 间隙锁(Gap Lock)

锁住索引之间的空隙,防止插入数据,解决幻读

3. 临键锁(Next-Key Lock)

记录锁 + 间隙锁,左开右闭区间,

InnoDB RR 隔离级别默认锁,彻底防幻读。


四、其他常见锁

1. 意向锁

表级锁,用来快速判断表里有没有行被锁,提升效率。

2. 自增锁

针对自增主键,保证 ID 连续不重复。

3. 死锁

两个事务互相持有对方需要的锁,互相等待,卡死。


五、一张表秒懂所有锁

表格

锁类型

粒度

特点

适用场景

全局锁

整个库

全库只读

全库备份

表锁

整张表

快、并发低

低并发、批量操作

行锁

单行

并发高、可能死锁

高并发业务

共享锁

数据库死锁(MySQL 锁到底有哪些?一张表搞懂所有锁,再也不懵)

行 / 表

可读不可写

多读少写

排他锁

行 / 表

独占读写

增删改

记录锁

单行索引

锁具体记录

精准更新

间隙锁

索引间隙

防插入

防幻读

临键锁

区间

行锁 + 间隙锁

RR 级别默认


六、极简总结(面试直接背)

  1. InnoDB 支持表锁 + 行锁,默认行锁
  2. 读锁共享,写锁排他
  3. 临键锁 = 记录锁 + 间隙锁,用来防幻读
  4. 没索引会导致行锁升级成表锁,并发爆炸
  5. 锁粒度越小,并发越高,越容易死锁

心有所向,日复一日,深耕不辍,终能光芒万丈。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有