它是MySQL InnoDB 存储引擎在索引页中定义的一条虚拟伪记录是索引逻辑上的 “最大值边界”并非真实存在的用户数据记录。作用标记索引页中所有记录的 “上界”用于处理索引范围的间隙锁与 Next-Key Lock防止幻读。位置每个索引页的末尾和开头的infimum pseudo-record下界虚拟记录对应。 为什么会出现supremum pseudo-record锁在可重复读RR隔离级别下InnoDB 使用Next-Key Lock记录锁 间隙锁来防止幻读。当事务执行范围查询如WHERE id 18或无匹配条件的查询并加锁时InnoDB 会扫描索引直到遇到supremum pseudo-record才停止。对这条虚拟记录加锁本质是锁住了(当前最大索引值, ∞)这个间隙。这样其他事务就无法插入大于当前索引最大值的数据避免幻读。 关键特性与影响锁的本质对supremum pseudo-record加锁本质是锁住索引末尾的间隙而不是某条真实记录。典型场景范围查询如WHERE id ?且查询条件包含大于表中所有记录的值空表执行SELECT ... FOR UPDATE/LOCK IN SHARE MODE会直接锁住整个(-∞, ∞)区间唯一索引冲突时的加锁流程也会对它加锁。并发影响对supremum pseudo-record加锁后所有插入大于当前最大值的记录操作都会被阻塞这也是很多 “新数据插入莫名被锁” 的常见原因。尤其是使用自增主键时新数据总是插入索引末尾此时锁会直接阻塞所有新的INSERT。 如何排查与优化定位场景通过performance_schema.data_locks表查看锁信息若出现supremum pseudo-record通常和范围查询加锁、空表加锁或唯一键冲突有关。优化方案尽量使用等值查询代替范围查询如WHERE id ?而非WHERE id ?避免触发大范围 Next-Key Lock调整事务隔离级别为读已提交RC此时 InnoDB 会退化为仅记录锁不再加间隙锁避免在空表上执行带锁的范围查询或在事务中提前插入边界数据。
什么是 supremum pseudo-record?
发布时间:2026/6/15 0:50:38
它是MySQL InnoDB 存储引擎在索引页中定义的一条虚拟伪记录是索引逻辑上的 “最大值边界”并非真实存在的用户数据记录。作用标记索引页中所有记录的 “上界”用于处理索引范围的间隙锁与 Next-Key Lock防止幻读。位置每个索引页的末尾和开头的infimum pseudo-record下界虚拟记录对应。 为什么会出现supremum pseudo-record锁在可重复读RR隔离级别下InnoDB 使用Next-Key Lock记录锁 间隙锁来防止幻读。当事务执行范围查询如WHERE id 18或无匹配条件的查询并加锁时InnoDB 会扫描索引直到遇到supremum pseudo-record才停止。对这条虚拟记录加锁本质是锁住了(当前最大索引值, ∞)这个间隙。这样其他事务就无法插入大于当前索引最大值的数据避免幻读。 关键特性与影响锁的本质对supremum pseudo-record加锁本质是锁住索引末尾的间隙而不是某条真实记录。典型场景范围查询如WHERE id ?且查询条件包含大于表中所有记录的值空表执行SELECT ... FOR UPDATE/LOCK IN SHARE MODE会直接锁住整个(-∞, ∞)区间唯一索引冲突时的加锁流程也会对它加锁。并发影响对supremum pseudo-record加锁后所有插入大于当前最大值的记录操作都会被阻塞这也是很多 “新数据插入莫名被锁” 的常见原因。尤其是使用自增主键时新数据总是插入索引末尾此时锁会直接阻塞所有新的INSERT。 如何排查与优化定位场景通过performance_schema.data_locks表查看锁信息若出现supremum pseudo-record通常和范围查询加锁、空表加锁或唯一键冲突有关。优化方案尽量使用等值查询代替范围查询如WHERE id ?而非WHERE id ?避免触发大范围 Next-Key Lock调整事务隔离级别为读已提交RC此时 InnoDB 会退化为仅记录锁不再加间隙锁避免在空表上执行带锁的范围查询或在事务中提前插入边界数据。