文章目录
1.MySQL有哪些锁?
- 全局锁
- 表级锁
- 表锁
- 元数据锁
- 意向锁
- 行级锁
- 记录锁
- 间隙锁
- 临键锁
- 临时意向锁
我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。
我比较熟悉的是表级锁和行级锁,如果我们对表结构进行修改时,MySQL就会对这个表结构加一个元数据锁。
行级锁目前只有InnoDB存储引擎实现了,主要有记录锁、间隙锁、临键锁、插入意向锁。
以下是对上述内容的详细注释、解释以及相关知识的补充:
1.1 全局锁
全局锁是对整个数据库实例加锁,常见命令为:
FLUSH TABLES WITH READ LOCK;
这会让整个数据库变成只读状态,适用于备份数据的场景。缺点是会阻塞其他所有写操作和DDL操作,因此不常用于线上环境。
1.2 表级锁
表级锁是对表操作的一种锁机制,分为以下几种:
-
表锁
- 表锁是最基本的表级锁,执行语句时通过
LOCK TABLES ...
显式加锁。 - 优点是简单,开销低;缺点是并发能力较弱。
- 表锁是最基本的表级锁,执行语句时通过
-
元数据锁 (MDL)
- 自动加锁,无需用户干预。
- 当对表结构进行修改(如
ALTER TABLE
)或查询(如SELECT
)时,会加MDL锁以防止其他线程同时操作同一个表的元数据。 - 读操作会加 共享MDL锁,写操作会加 独占MDL锁。
-
意向锁 (Intention Locks)
- 用于表级锁和行级锁之间的兼容性检查。
- 意向锁本身不