后端面经系列-明明有行锁,怎么突然就加了表锁

后端面经系列-明明有行锁,怎么突然就加了表锁

August 20, 2023
后端开发, 数据库
mysql, 数据库
如无特殊说明,本文默认mysql使用的存储引擎是InnoDB。

什么是行锁、表锁?什么时候加表锁?怎么避免? #

行锁,是指锁的粒度是行级别的,其锁定的记录是某个记录或者间隙(也可能是多个)。表锁是指锁的粒度是表级别的。

以下场景会添加表锁:

  • 对某些记录添加锁前,会添加表级别的IS、IX。
  • 使用lock table是、语句时,会添加表锁。
  • 获取自增id时,有AUTO-INC锁。
  • 有些场景下,会添加MDL锁,比如alter table、truncate table、drop table等。
  • innodb自身的表锁,在崩溃恢复等特殊场景中会用到。

执行update、delete、insert语句执行时,innodb是不会加表锁的。有些地方会说执行update语句时,如果没用到索引,会转化为表锁, 这不太准确,这种场景,如果是RR级别,会锁定所有扫描到记录和间隙,在效果上类似于表锁,但是不是表锁。

什么是乐观锁?怎么在MySQL里面实现一个乐观锁 #

乐观锁,是指乐观的认为要更新的记录不会被修改,所以不加锁,而是在更新时判断记录是否被修改过。

一般是添加版本号字段(或者类似方式)。比如有一个版本号字段version,更新前该版本号是100,更新时在where条件中加上version=100这个条件。 如果更新成功,version字段+1,。如果更新时version不是100,则影响的记录数是0。

什么是意向锁?可以举一个例子吗? #

  • IX、IS锁,是意向锁。其本身只是为了后续在加表级别的S锁和X锁时,判断表中是否有已经被加锁的记录,以避免用遍历的方式来查看表中有没有上锁的记录。
  • 插入意向锁,在插入时,如果要插入的位置已经有间隙锁,则在等待时也需要再内存中生成锁结果,表明有实物想在这个间隙插入新记录,但是现在处于等待状态 ,这种类型的锁就是插入意向锁。

什么是共享锁和排它锁?它们有什么特性? #

  • 多个事务可以同时持有共享锁。如果某条记录或间隙已经被添加共享锁,则其它事务不能添加排它锁。
  • 只能有一个事务执行排它锁。如果某条记录或间隙已经被添加排它锁,则其它事务既不能添加排它锁,也不能添加共享锁。

什么是两阶段加锁 #

两阶段锁,是在锁在需要的时候被添加,但是要到事务结束的时候才被使用。

innodb会对扫描到的记录添加锁,如果是RR级别,即使扫描的记录不匹配,也会持有锁到事务结束。但是如果是RC级别的锁,如果扫描到的记录不匹配,则会释放锁。

什么是记录锁、间隙锁和临键锁? #

  • 记录锁是锁定某条索引记录的锁。
  • 间隙锁是锁定两个索引记录之间的间隙的锁。
  • 临键锁,即next-key lock,是记录锁和间隙锁的结合,它锁定某条记录和这条记录之前的一个间隙。

RC级别有间隙锁和临键锁? #

RC级别下,在大多数场景中,不会有间隙锁和临键锁。但是如果是插入新记录时遇到唯一二级索引重复,都会对已经在B+树中的那条唯一二级索引记录添加next-key锁。

MySQL是怎么在RR级别下解决幻读的? #

在RR级别下,InnoDB锁住了相关的索引记录和间隙,所以在插入新记录时,会被阻塞。就是说: 不会产生新的记录,在某种程度上可以说是解决了幻读问题。

什么情况下会就加临键锁?什么情况下会加间隙锁?什么时候加记录锁? #

  • RR级别,会为扫描到的记录添加临键锁。
  • RR级别,精确匹配,则会为扫描区间的下一条记录添加间隙锁。
  • RR级别,如果不是等值查询,且没有找到记录,在会在扫描区间的下一条记录添加next-key锁。
  • 唯一索引,遇到唯一索引重复,会添加next-key锁。
  • RR级别,使用唯一索引进行等值查询,或者是RC级别下添加锁时,只会添加记录锁。

唯一索引和普通索引会怎么影响锁? #

唯一索引,添加锁时,如果是where是等值查询,则只会添加记录锁,不会添加间隙锁,如果是范围查询,则会添加记录锁和间隙锁。

你遇到过什么死锁的问题吗?怎么排查的?最终又是怎么解决的? #

遇到过更新语句死锁问题,使用到了索引合并,当时在搜索引擎上搜索,发现有类似案例,索引合并有可能会导致死锁。解决办法是修改索引,使其只使用到了一个索引。

你有没有优化过锁?怎么优化的? #

我曾经遇到过场景,一条update语句,where语句不符合最左匹配原则,即没有索引中的第一个字段,导致出现慢SQL告警,更新语句长时间处于 Searching Rows For Update状态,即长时间在搜索要更新的记录。解决办法是修改语句,使其符合最左匹配原则。