把这句话拆成 4 个关键词来理解,就能明白「为什么表锁是这种特性」:
- 开销小、加锁快
- 不会出现死锁
- 锁定粒度大
- 冲突概率高、并发度最低
下面逐条解释,并给一段极简代码帮助直观感受。
- 开销小、加锁快
- 表锁只在「表」这一层维护一把锁(通常是一个内存标志位或元数据锁)。
- 加锁时无需遍历行/页,直接对表级别的锁状态做一次 CAS 或系统调用即可。
- 代码示意(伪代码,仅演示概念):
java
// MySQL 层伪代码
if (table.lock.compareAndSet(UNLOCKED, LOCKED)) {
// 成功拿到表锁
} else {
// 被阻塞
}- 不会出现死锁
- 死锁的必要条件之一是「循环等待」:线程 A 等待线程 B 持有的资源,B 又在等待 A 持有的资源。
- 表锁只有一把,所有事务按「先到先得」排队,不存在「A 锁表 1、B 锁表 2,然后 A 想再锁表 2、B 想再锁表 1」这种交叉等待场景。
- 因此天然破坏了「循环等待」条件,死锁概率为零。
- 锁定粒度大
- 粒度大 = 锁覆盖的数据范围大。
- 表锁一旦加上,整张表的所有记录都被锁住,无论你要改 1 行还是 100 万行。
- 冲突概率高、并发度最低
- 冲突概率 ∝ 锁粒度。粒度越大,不同事务想同时操作「同一张表」的概率就越高。
- 任何写操作(甚至某些读操作)都要互斥地抢同一把表锁,导致排队。
- 并发度(TPS/QPS)被这把全局锁直接限制,因此是「最低」。
一句话总结
表锁就像大门口的保安一次只放一个人进楼:
- 保安检查简单 → 开销小、加锁快;
- 只有一道门 → 不会出现「你等我、我等你」的死锁;
- 一个人进去后整座楼被锁 → 粒度大;
- 想进楼的人多了就排队 → 冲突高、并发低。