本文共 2187 字,大约阅读时间需要 7 分钟。
MySQL 的锁机制是数据库管理中至关重要的一部分,它不仅保证了数据的一致性,还显著提升了数据库的并发性能。根据锁的粒度和用途,MySQL 提供了多种锁类型,每种锁类型都有其独特的作用范围、适用存储引擎以及适用的场景。以下是MySQL 锁的详细分类和应用场景分析。
全局锁会锁住整个数据库,阻止所有写入(DML)操作,通常用于全库一致性备份。全局锁的作用范围是整个数据库,适用于所有存储引擎,但在高并发环境中并不适用。
通过执行以下命令可以获取全局锁:
FLUSH TABLES WITH READ LOCK;
此时,只允许读操作,阻止写入。全局锁适用于 MyISAM 和 InnoDB,但不适合高并发环境。
表级锁作用于整个表,适用于 MyISAM 和 InnoDB,但 InnoDB 默认使用行锁。
共享锁(READ 锁,S 锁):
LOCK TABLES users READ;
排他锁(WRITE 锁,X 锁):
LOCK TABLES users WRITE;
行级锁作用于具体的行,是 InnoDB 的默认锁机制,特别适用于高并发环境。
共享锁(S 锁,LOCK IN SHARE MODE):
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
排他锁(X 锁,FOR UPDATE):
SELECT * FROM users WHERE id = 1 FOR UPDATE;
意向锁是一种表级锁,用于优化行锁的管理,避免表锁与行锁的冲突。
SELECT * FROM users WHERE id = 1 FOR UPDATE;
意向锁能够提升行锁管理效率,防止表锁和行锁的冲突。
间隙锁锁住一个范围,防止数据插入,避免幻读。
间隙锁锁住 20 ≤ age ≤ 30 之间的范围,防止新数据插入。
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;
间隙锁能够防止幻读,但会影响插入操作,可能导致死锁。
Next-Key Lock = 行锁 + 间隙锁,用于 REPEATABLE READ 级别,防止幻读。
如果索引有 (5,10,15):
Next-Key 锁能够避免幻读问题,但在 READ COMMITTED 级别不会生效,影响并发性能。
MDL 锁保护表结构,防止 DDL(ALTER、DROP)与 DML(INSERT、SELECT)冲突。
MDL 锁防止数据不一致,DDL 操作必须等待 DML 释放锁。
SELECT * FROM users; -- 自动加 MDL 读锁ALTER TABLE users ADD COLUMN age INT; -- MDL 写锁,阻塞
MDL 锁能够防止数据不一致,但可能导致 DDL 阻塞,影响系统可用性。
锁类型 | 作用范围 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
全局锁 | 整库 | 备份 | 一致性高 | 并发性能差 |
表锁 | 整表 | 批量操作 | 低开销 | 影响并发 |
行锁 | 具体行 | 高并发事务 | 高并发 | 可能死锁 |
间隙锁 | 行间隙 | 防止幻读 | 保证一致性 | 降低并发 |
Next-Key | 行+间隙 | RR 事务 | 防止幻读 | 性能较低 |
MDL | 表结构 | DDL 操作 | 防止冲突 | 可能阻塞 |
MySQL 锁的选择需要根据业务场景和并发需求灵活调整,以保证数据一致性和高性能。
转载地址:http://mndfk.baihongyu.com/