Mysql 各种锁摘要
各种锁
全局锁 FTWRL
mysql 通过flush table with read lock
来加全局读锁。使用了FTWRL后整个库只能读,不能个更新和执行DDL,有更新的事务等
用处:
- 逻辑备份。如果数据库中有一张表不是事务引擎,使用mysqldump就无法使用
--single-transaction
来开启一致性视图来备份,这个时候FTWRL就有用了。
FTWRL在客户端断开时,就会释放
表级锁 表锁和MDL
表锁 lock tables ... read / write
加表锁的语句为lock tables t1 read, t2 write
;
作用对象是其他mysql线程和加表锁的线程。
影响情况如下表格所示
读写状态 | t1 | t2 |
---|---|---|
本线程 | 读 | 读写 |
其他线程 | 读 | NA |
MDL metadata lock
访问一个表会自动加上mdl读锁,mdl读锁和写锁之间的存在互斥关系,mdl读锁之间不互斥。
是否互斥 | 读锁 | 写锁 |
---|---|---|
读锁 | NO | YES |
写锁 | YES | YES |
对表进行CRUD,mysql就会加mdl读锁,对表结构进行变更,mysql就会加mdl写锁
行级锁
Intention locks 意向锁
原文好多,这里就举两个例子:
- intention shared lock 意向共享锁(IS)
select * from t lock in share mode
- intention exclusive lock 意向排它锁(IX)
select * from t for update
记录锁
记录锁用来锁住索引记录的行。比如select c1 from where c1 = 10 for update
。换种说法,就是加载有索引的行上的锁,按照mysql官方文档,即使该行没有索引,mysql也会为该行创造一个隐藏的索引。
间隙锁 gap locks
间隙锁用来锁住记录之间的空隙,防止插入记录,比如(a,b),(a, supermum), (infimum, a), supermum和infimum可以认为是记录的上限和下限。间隙锁和间隙锁之间不互斥。
临键锁 next-key locks
next-key locks 等于 行锁 + gap locks, 可以理解为一个左开右闭区间。RR事务级别和next-key locks 可以用来防止幻读。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署