假设我们有一个带有自动递增主键的表。我要加载的所有ID大于我看到的最后一个ID。
SELECT id
FROM mytable
WHERE id > 10;
使用幼稚的方法,我可能会跳过ID:
作为解决方案,我建议进行仔细检查,以确保不会提交任何中间ID:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(*)
FROM mytable
WHERE id > 10
AND id <= 12; -- Where 12 was the max seen in the first query
如果计数大于在第一个查询中看到的ID数量,则肯定有可能在该序列的空缺中提交其他ID。
问题是:反向是否成立?如果计数等于(或小于)在第一个查询中看到的ID数量,是否保证之间没有值?还是我错过了一些可能的情况,其中要求了ID,但是READ UNCOMMITTED
查询还没有看到它们?
对此问题,请忽略:
Mysql在auto_increment期间锁定了表。
请参阅
https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html
因此,如果版本中没有错误,通常不会出现此问题。
该锁的工作方式类似于信号量/关键部分。