MySQL中有哪些锁
一、按锁粒度分类
1. 全局锁
作用于整个数据库实例,保障全库操作一致性。
(1) FTWRL(Flush Tables with Read Lock)
作用:刷新所有表到磁盘,并使非 SUPER 权限会话进入只读状态
场景:全库逻辑备份(如 mysqldump --lock-all-tables)
注意:持有期间阻塞所有 DML 和 DDL,长时间持有会导致业务阻塞
(2) LOCK INSTANCE FOR BACKUP(MySQL 8.0+)
目标:为物理备份提供更温和的全局锁
特点:允许普通业务读写,仅阻止破坏性操作(如实例关闭、表结构变更等)
优势:相比 FTWRL,对业务影响更小
2. 表级锁
(1) 表锁(Table Lock)
读锁:允许多线程读,阻止所有写操作
写锁:独占整张表,阻止其他所有读写操作
限制:持有表锁时会话只能访问被锁表
(2) 元数据锁(MDL)
作用:自动加锁,保证 DDL 与 DML 操作互斥
读锁:由 SELECT 等读操作触发,可共存
写锁:由 ALTER 等 DDL 操作触发,与任何锁互斥
注意:MDL 在事务结束时释放,长事务会阻塞 DDL
(3) 意向锁
目的:协调表级锁与行级锁,提升检测效率
IS 锁:由
SELECT...LOCK IN SHARE MODE
触发,表明意图加行级 S 锁IX 锁:由 DML 语句触发,表明意图加行级 X 锁
兼容性:IS 与 IX 可共存,与表读锁兼容,与表写锁互斥
3. 行级锁
作用于单行或多行记录,依赖索引实现。
(1) 记录锁(Record Lock)
锁定单条索引记录
无索引时退化为表锁
事务提交时释放
(2) 间隙锁(Gap Lock)
锁定索引记录间的间隙
仅 RR 隔离级别下生效,防止幻读
允许多个事务持有同一间隙锁
(3) Next-Key Lock
记录锁 + 间隙锁,RR 级别默认行锁模式
锁定左开右闭区间
唯一索引精确匹配时退化为记录锁
(4) 插入意向锁
特殊的间隙锁,INSERT 操作时触发
允许不同位置的并发插入,同一位置插入互斥
二、按功能分类
1. 共享锁(S 锁)
获取方式:
SELECT...LOCK IN SHARE MODE
特性:允许多事务共享读,阻塞写操作
兼容性:与 S 锁兼容,与 X 锁互斥
2. 排他锁(X 锁)
获取方式:
SELECT...FOR UPDATE
及 DML 语句特性:独占资源,阻塞其他所有锁请求
兼容性:与 S 锁和 X 锁均互斥