Skip to content

把这句话拆成 4 个关键词来理解,就能明白「为什么表锁是这种特性」:

  1. 开销小、加锁快
  2. 不会出现死锁
  3. 锁定粒度大
  4. 冲突概率高、并发度最低

下面逐条解释,并给一段极简代码帮助直观感受。


  1. 开销小、加锁快
  • 表锁只在「表」这一层维护一把锁(通常是一个内存标志位或元数据锁)。
  • 加锁时无需遍历行/页,直接对表级别的锁状态做一次 CAS 或系统调用即可。
  • 代码示意(伪代码,仅演示概念):
java
// MySQL 层伪代码
if (table.lock.compareAndSet(UNLOCKED, LOCKED)) {
    // 成功拿到表锁
} else {
    // 被阻塞
}

  1. 不会出现死锁
  • 死锁的必要条件之一是「循环等待」:线程 A 等待线程 B 持有的资源,B 又在等待 A 持有的资源。
  • 表锁只有一把,所有事务按「先到先得」排队,不存在「A 锁表 1、B 锁表 2,然后 A 想再锁表 2、B 想再锁表 1」这种交叉等待场景。
  • 因此天然破坏了「循环等待」条件,死锁概率为零。

  1. 锁定粒度大
  • 粒度大 = 锁覆盖的数据范围大。
  • 表锁一旦加上,整张表的所有记录都被锁住,无论你要改 1 行还是 100 万行。

  1. 冲突概率高、并发度最低
  • 冲突概率 ∝ 锁粒度。粒度越大,不同事务想同时操作「同一张表」的概率就越高。
  • 任何写操作(甚至某些读操作)都要互斥地抢同一把表锁,导致排队。
  • 并发度(TPS/QPS)被这把全局锁直接限制,因此是「最低」。

一句话总结
表锁就像大门口的保安一次只放一个人进楼:

  • 保安检查简单 → 开销小、加锁快;
  • 只有一道门 → 不会出现「你等我、我等你」的死锁;
  • 一个人进去后整座楼被锁 → 粒度大;
  • 想进楼的人多了就排队 → 冲突高、并发低。