Skip to content

面试速答(先看这里)

**一句话结论:**首先,在我们常用的Innodb引擎上,默认的加锁是行级锁(当然还有gap lock 和 next key lock),虽然也有可能会进行表锁,但是Innodb会尽可能的避免锁表。

60秒标准回答:

首先,在我们常用的Innodb引擎上,默认的加锁是行级锁(当然还有gap lock 和 next key lock),虽然也有可能会进行表锁,但是Innodb会尽可能的避免锁表。只有在极特殊情况下,比如没有用到索引,需要全表扫描时,才 有可能 会用到表级锁,但是也是有可能,并不代表着一定会加表锁

另外,在MyISAM 存储引擎上,update语句会默认使用表锁的

还有,如果我们显示的要进行表锁了,如 LOCK TABLES 那么也会进行表锁,包括Innodb

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**另外,在MyISAM 存储引擎上,update语句会默认使用表锁的。
  • **要点2:**还有,如果我们显示的要进行表锁了,如 LOCK TABLES 那么也会进行表锁,包括Innodb。
  • **要点3:**InnoDB 使用行级锁(Row-level Locking)作为默认的锁定机制。
  • **要点4:**如果 UPDATE 语句中使用了有效的索引,并且查询条件能够定位到具体的行,InnoDB 会仅锁定匹配条件的行,而不是整个表。
  • **要点5:**如果查询条件没有明确指定索引,虽然InnoDB 可能会使用全表扫描,但也不意味着Innodb就会锁全表,它仍然会倾向于使用行锁,对查找到的每一行进行锁定。

**记忆锚点:**Innodb → InnoDB → update → UPDATE → lock → Innodb的行级锁机制

易错提醒:

  • 首先,在我们常用的Innodb引擎上,默认的加锁是行级锁(当然还有gap lock 和 next key lock),虽然也有可能会进行表锁,但是Innodb会尽可能的避免锁表。

加分表达:

  • 还有,如果我们显示的要进行表锁了,如 LOCK TABLES 那么也会进行表锁,包括Innodb。
  • 如果 UPDATE 语句中使用了有效的索引,并且查询条件能够定位到具体的行,InnoDB 会仅锁定匹配条件的行,而不是整个表。
  • 如果查询条件没有明确指定索引,虽然InnoDB 可能会使用全表扫描,但也不意味着Innodb就会锁全表,它仍然会倾向于使用行锁,对查找到的每一行进行锁定。

追问准备:

  • 围绕「Innodb」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「InnoDB」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「update」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

首先,在我们常用的Innodb引擎上,默认的加锁是行级锁(当然还有gap lock 和 next key lock),虽然也有可能会进行表锁,但是Innodb会尽可能的避免锁表。只有在极特殊情况下,比如没有用到索引,需要全表扫描时,才有可能会用到表级锁,但是也是有可能,并不代表着一定会加表锁。

另外,在MyISAM 存储引擎上,update语句会默认使用表锁的。

还有,如果我们显示的要进行表锁了,如 LOCK TABLES 那么也会进行表锁,包括Innodb。

扩展知识 ​

Innodb的行级锁机制 ​

InnoDB 使用行级锁(Row-level Locking)作为默认的锁定机制。执行 UPDATE 语句时,InnoDB 会根据所更新的记录的索引来锁定特定的行。

如果 UPDATE 语句中使用了有效的索引,并且查询条件能够定位到具体的行,InnoDB 会仅锁定匹配条件的行,而不是整个表。这是最常见的情况。

如果查询条件没有明确指定索引,虽然InnoDB 可能会使用全表扫描,但也不意味着Innodb就会锁全表,它仍然会倾向于使用行锁,对查找到的每一行进行锁定。

行级锁&表级锁 ​

📄 ✅InnoDB中的表级锁、页级锁、行级锁?

打开文档:✅InnoDB中的表级锁、页级锁、行级锁?

锁的到底是什么? ​

📄 ✅MySQL的行级锁锁的到底是什么?

打开文档:✅MySQL的行级锁锁的到底是什么?