在 MySQL(默认使用 InnoDB 存储引擎)中,执行带有时间范围的 语句导致其他事务无法插入新数据,根本原因是 InnoDB 的锁机制(特别是间隙锁 Gap Lock 和 临键锁 Next-Key Lock)。 下面详细解释其原因及提供解决方案。 --- 一、 为什么会被阻塞?(原因分析) MySQL InnoDB 的默认事务隔离级别是 可重复读(Repeatable Read, RR)。为了防止在这个隔离级别下出现“幻读”(即一个事务两次查询结果数量不一致,有新数据插入),InnoDB 在范围查询或更新时,会使用 临键锁(Next-Key Lock),它是由“记录锁(Record Lock)”和“间隙锁(Gap Lock)”组成的。 导致插入被阻塞通常有以下两种情况: 情况 1: 字段没有加索引 如果你没有为 创建索引,MySQL 无法通过索引定位数据,只能进行全表扫描。 锁表现:InnoDB 会锁定表中的所有记录,以及所有记录之间的所有间隙。 结果:这实际上等同于锁住了整张表,其他事务既不能更新现有数据,也完全无法插入任何新数据。 情况 2: 字段有普通索引 即使 有索...