MySQL 中有哪些锁类型?

MySQL 中有哪些锁类型

InnoDB锁可以按粒度、兼容性、实现、意向锁几个维度划分,面试重点:行锁、表锁、意向锁、间隙锁、临键锁、MDL元数据锁。

一、按锁粒度划分

1. 表级锁:锁住整张表

  1. 表共享读锁(S锁)
    lock table xxx read,多个事务可以同时加读锁;有读锁时,其他事务不能写。
  2. 表排他写锁(X锁)
    lock table xxx write,只有一个事务持有,其他事务读写都阻塞。

MyISAM默认使用表锁;InnoDB一般不会手动用表锁,粒度大,并发差。

2. 行级锁(InnoDB特有,只锁行记录)

只锁被操作的数据行,并发高。

  • 行共享读锁 S(共享锁)select ... lock in share mode
    多个事务可以同时加S锁;如果有S锁,其他事务不能加X锁做修改。
  • 行排他写锁 X(排他锁)update / delete / select ... for update
    当前事务独占,其他事务不能加S、X锁,读写阻塞。

行锁只有走索引才会生效;如果没用到索引,InnoDB会退化成表锁

意向锁(意向共享IS、意向排他IX)

意向锁是表级锁,InnoDB自动加,不需要手动操作。

  • 意向共享 IS:事务准备给表中某些行加S锁,先给表加IS
  • 意向排他 IX:事务准备给表中某些行加X锁,先给表加IX

作用:快速判断表锁和行锁之间是否冲突,避免遍历每一行锁做判断。

意向锁之间互相兼容;意向锁和普通S/X表锁互斥。

二、RR可重复读隔离级别特有:解决幻读

1. 间隙锁 Gap Lock

锁住索引记录之间的间隙 ,不锁记录本身,防止其他事务在间隙插入新数据。

只存在于RR隔离级别;RC隔离级别没有间隙锁。

2. 临键锁 Next‑Key Lock

行锁 + 间隙锁的组合,InnoDB RR默认加的锁

左开右闭区间,锁住当前记录,同时锁住前面的间隙,防止插入,以此解决幻读。

当查询命中唯一索引等值匹配,临键锁会退化为普通行锁。

三、MDL 元数据锁(Metadata Lock)

表结构锁,5.6之后引入,访问表自动获取。

  • MDL读锁:增删改查DML,加MDL读锁,多个事务共享。
  • MDL写锁:alter table 修改表结构DDL,加MDL写锁,排他。

经典坑:长事务持有MDL读锁,此时执行alter table会被阻塞,后续所有DML全部堵塞,库雪崩。

锁兼容矩阵

锁类型 S X IS IX
S 兼容 互斥 兼容 互斥
X 互斥 互斥 互斥 互斥
IS 兼容 互斥 兼容 兼容
IX 互斥 互斥 兼容 兼容

补充区分:乐观锁 & 悲观锁

  1. 悲观锁:认为一定会发生冲突,操作直接上锁。InnoDB的S、X、临键锁都属于悲观锁。
  2. 乐观锁:不加数据库锁,业务实现,依靠版本号version或者时间戳,更新时判断版本。
sql 复制代码
update table set val=?,version=version+1 where id=? and version=old_version

面试高频小结

  1. RC隔离级别:只有行锁,没有间隙锁、临键锁,幻读靠业务控制;
  2. RR隔离级别:默认临键锁,等值命中唯一索引退化成行锁;
  3. 行锁失效条件:索引失效,升级为表锁;
  4. MDL锁坑点:长事务阻塞DDL,引发大量等待;
  5. 意向锁是InnoDB内部表锁,不需要手动干预。

总结:

粒度上分表锁、行锁、意向锁;RR下有间隙锁、临键锁;还有MDL元数据锁;思想上分悲观锁、乐观锁。RC没有间隙锁,RR靠临键锁解决幻读。

相关推荐
聚美智数5 小时前
车辆合格证OCR识别-机动车合格证识别-车辆合格证OCR‑机动车出厂证解析‑整车参数提取 API 接口介绍
数据库·经验分享
DBA_G5 小时前
南大通用技术分享:GBase 8a数据库执行计划架构原理解析
数据库
军训猫猫头5 小时前
C# 封装 MySQL 自动写入与查询工具类(基于 MySqlConnector)
mysql·c#·.net·wpf
QQ_21696290965 小时前
基于SpringBoot+Vue的小生活平台的设计与实现
java·数据库·vue.js·spring boot·spring·微信小程序·生活
考虑考虑13 小时前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog13 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
梦想平凡15 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
xcLeigh15 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai16 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
AugustRed17 小时前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j