跳至内容
1. 锁的分类

1. 锁的分类

Q: MySQL中有哪几种锁?

按锁粒度划分

表锁

  • 特点:开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁

行锁

  • 特点:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

页锁

  • 特点:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

按兼容性划分

共享锁(S Lock)

  • 也叫读锁(read lock)
  • 事务在读取数据的时候获取共享锁,允许多个事务同时获取

排他锁(X Lock)

  • 也叫写锁(write lock)
  • 排它锁是阻塞的,在一定时间内,只有一个请求能执行写入,并阻止其它锁读取正在写入的数据

Q: InnoDB里行锁的实现?

MySQL默认行锁类型就是临键锁(Next-Key Locks)。当使用唯一性索引,等值查询匹配到一条记录的时候,临键锁会退化成记录锁;没有匹配到任何记录的时候,退化成间隙锁。

Record Lock 记录锁

  • 作用:解决不可重复读
  • 机制:记录锁就是直接锁定某行记录。当我们使用唯一性的索引(包括唯一索引和聚簇索引)进行等值查询且精准匹配到一条记录时,此时就会直接将这条记录锁定。其他事务就不能进行更新删除这个数据
  • 注意:记录锁是锁住索引记录,不是真正的数据记录,如果要锁的列没有索引,就会进行全表加锁

Gap Lock 间隙锁

  • 作用:在可重复读情况下解决幻读
  • 机制:间隙锁就是锁定某些间隙区间的。当我们使用等值查询或者范围查询,并且没有命中任何一个记录,此时就会将对应的间隙区间锁定,锁定的是一个范围(开区间),不包括记录
  • 效果:锁住之后间隙内就不会有数据插入

Next-key Lock 临键锁

  • 作用:解决幻读
  • 机制:临键锁就是记录锁(Record Locks)和间隙锁(Gap Locks)的结合,除了锁住记录本身,还要再锁住索引之间的间隙,避免插入新的数据,所以引入了间隙锁
  • 范围:临键指的是间隙加上它右边的记录组成的左开右闭区间。比如(1,6]、(6,8]等
  • 使用场景:当我们使用范围查询,并且命中了部分记录,此时锁住的就是临键区间。注意,临键锁锁住的区间会包含最后一个record的右边的临键区间
记忆技巧:Record锁记录,Gap锁间隙,Next-key锁记录+间隙。锁的范围越来越大,解决的问题也越来越多。