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靠临键锁解决幻读。

相关推荐
Hive_MOM39 分钟前
制造企业技术文件与图纸管理数字化(DCC):从“图纸满天飞“到版本受控
服务器·数据库·制造
咋的啥名都用不了呢~40 分钟前
Oracle数据库1
数据库
小则又沐风a1 小时前
MySQL表的约束详解
数据库·mysql
赵渝强老师1 小时前
【赵渝强老师】崖山数据库的联机重做日志文件
数据库·国产数据库·yashandb·崖山数据库
南城以南溫暖如初1471 小时前
树洞交友系统架构设计与匿名聊天实战指南
java·spring boot·mysql·系统架构·vue·mybatis·交友
家有娇妻张兔兔1 小时前
Redis 报错 “MISCONF Redis is configured to save RDB snapshots“?一文讲透根因与根除方案
数据库·redis·故障排查·misconf
迷迭香yy1 小时前
回测过拟合检测体系从样本内外到组合稳健性评估 IG50免费开源股票数据API接口
服务器·开发语言·数据库·人工智能·python
敲上瘾3 小时前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
2401_894915536 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎