MySQL nextkey lock 加锁范围总结:一定要实际操作

data_locks

select * from performance_schema.data_locks;
LOCK_MODE LOCK_DATA 锁范围
X,REC_NOT_GAP 15 15 那条数据的行锁
X,GAP 15 15 那条数据之前的间隙,不包含 15
X 15 15 那条数据的间隙,包含 15
  • LOCK_MODE = X 是前开后闭区间;
  • X,GAP 是前开后开区间(间隙锁);
  • X,REC_NOT_GAP 行锁。
  • 这个单独介绍,是希望我理解的没有错误,如果大佬看到了,错误之处一定要帮忙指正出来。

    主键索引

  • 加锁时,会先给表添加意向锁,IX 或 IS;
  • 加锁是如果是多个范围,是分开加了多个锁,每个范围都有锁;(这个可以实践下 id < 20 的情况)
  • 主键等值查询,数据存在时,会对该主键索引的值加行锁 X,REC_NOT_GAP
  • 主键等值查询,数据不存在时,会对查询条件主键值所在的间隙添加间隙锁 X,GAP
  • 主键等值查询,范围查询时情况则比较复杂:
  • 8.0.17 版本是前开后闭,而 8.0.18 版本及以后,修改为了前开后开区间;
  • 临界