1. InnoDB 中 Next-Key Lock 的索引锁实现?
InnoDB 中 Next-Key Lock 是如何基于索引实现的?
- 临键锁基于索引
- 索引记录与间隙
- 无索引时退化为全表锁
InnoDB 的 Next-Key Lock 是基于索引实现的:锁加在索引记录及其间隙上,而非数据行本身。由于 InnoDB 所有查询都通过索引(聚簇索引或二级索引)定位记录,临键锁自然作用在索引记录上,锁定的区间由索引键值决定。若查询使用了二级索引,则同时在二级索引记录和聚簇索引记录上加锁。若查询没有走索引(全表扫描),InnoDB 会对表的每一条记录加临键锁,实际等同于锁住整个表,锁冲突极大。因此,临键锁"锁索引"的机制决定了合理索引对于控制锁范围至关重要。
临键锁"锁索引"的本质,决定了加锁范围与索引的选择强相关。没有合适索引时,临键锁会退化到全表加锁,造成严重锁竞争。