锁类型关系及作用解析

4 阅读2分钟

1. 行级锁(Row-Level Lock)

  • 支持引擎:InnoDB 支持,MyISAM 不支持。

  • 核心特点

    • 锁的粒度是,并发性能远高于表锁。
    • 必须依赖索引:如果查询没有命中索引,InnoDB 会退化为表锁,导致并发性能急剧下降。
    • 是 InnoDB 支持高并发事务的核心基础。

2. 记录锁(Record Lock)

  • 定义:精准锁定表中的一条具体记录(行)。

  • 锁的类型

    • S锁(共享锁/读锁) :多个事务可以同时持有同一行的S锁,用于读取数据,互不阻塞。
    • X锁(排他锁/写锁) :同一时间,只有一个事务能持有某行的X锁,用于修改数据。
  • 兼容性规则

    • S锁与S锁兼容(读读不互斥)。
    • S锁与X锁互斥(读写互斥)。
    • X锁与任何锁都互斥(写写互斥)。
  • 典型场景UPDATE ... WHERE id = ?SELECT ... FOR UPDATE 时,InnoDB 会对命中的行加X锁。


3. 间隙锁(Gap Lock)

  • 存在条件:只在 InnoDB 的**可重复读(RR)**隔离级别下存在。
  • 核心目的:解决 RR 隔离级别下的幻读问题。
  • 锁定对象:锁定的是索引记录之间的“空隙” ,而不是记录本身。
  • 作用:防止其他事务在这个间隙中插入新数据,从而保证在同一个事务内,多次查询的结果集行数一致。
  • 示例:如果表中有 id=1 和 id=3 的记录,执行 SELECT * FROM t WHERE id BETWEEN 1 AND 3 FOR UPDATE,InnoDB 会锁定 (1, 3) 这个间隙,阻止其他事务插入 id=2 的新记录。

4. 临键锁(Next-Key Lock)

  • 定义:是 记录锁 + 间隙锁 的组合,是 InnoDB 在 RR 隔离级别下的默认行锁算法
  • 锁定范围:锁定一个左开右闭的区间,既锁定区间内的记录,也锁定记录前的间隙。
  • 作用:彻底解决幻读问题,同时保证数据的一致性。
  • 示例:对于索引值 10,其对应的 Next-Key Lock 区间是 (5, 10]。这意味着它会锁定所有大于5且小于等于10的范围,防止新数据插入到这个区间内。

总结一下它们的关系

  • 行级锁是一个大的概念,包含了记录锁、间隙锁和临键锁。
  • 记录锁是锁定单行,间隙锁是锁定空隙,而临键锁是两者的结合,是 InnoDB 解决幻读的核心手段。

要不要我帮你画一张这几种锁的关系和作用的思维导图,让你一眼看懂它们的区别和联系?