MySQL 的锁机制是数据库管理系统中非常重要的一部分,它涉及到事务隔离性、并发性等方面:
-
MySQL锁的分类:
-
按层次划分:
- 全局锁(Global Lock): 作用于整个数据库实例,通常用于对整个数据库进行备份或主从同步时需要暂停写入操作。
- 表级锁(Table Lock): 作用于数据表,对表进行读写操作时加锁。包括读锁(共享锁)和写锁(排它锁)。
- 行级锁(Row Lock): 作用于表的行,对表中的某一行进行读写操作时加锁。可以更细粒度地控制事务并发。
-
按锁的颗粒度划分:
- 粗粒度锁: 如表锁,对整张表加锁。
- 细粒度锁: 如行锁,对表中的一行或某个数据项加锁。
-
-
MDL锁(Metadata Lock):
- MDL 锁是 MySQL 的元数据锁,用于保护元数据操作,如对表结构的修改。
- MDL 锁不是 InnoDB 存储引擎的实现,而是在 MySQL 服务器层实现的。
- MDL 锁的作用是为了解决事务隔离和数据复制问题。
-
InnoDB存储引擎的表级锁:
- IS锁(Intention Shared Lock): 意向共享锁,表示事务准备在表上加共享锁,即将对表中的某些行加行级共享锁。
- IX锁(Intention Exclusive Lock): 意向排它锁,表示事务准备在表上加排它锁,即将对表中的某些行加行级排它锁。
- S锁(Shared Lock): 共享锁,用于读操作,多个事务可以同时持有共享锁,互不影响。
- X锁(Exclusive Lock): 排它锁,用于写操作,事务独占资源,其他事务不能同时持有任何类型的锁。
-
InnoDB存储引擎的行级锁:
- Record Lock: 记录锁,锁定某行数据。
- Gap Lock: 间隙锁,锁定一个范围,但不包括记录本身。
- Next-Key Lock: 间隙锁和记录锁的结合,用于解决幻读问题。
- Insert Intention Lock: 插入意向锁,表示事务打算在一个范围内插入一个新记录。
-
行锁和表锁的选择:
- 行锁更适合高并发环境,可以提高并发性能,但会增加系统开销。
- 表锁适用于特定的场景,如全表扫描,适合于少量大事务操作。