ReadUncommitted可以知道将存在的所有LOWER自动增量ID吗?

问题描述 投票:0回答:1

假设我们有一个带有自动递增主键的表。我要加载的所有ID大于我看到的最后一个ID。

SELECT id
FROM mytable
WHERE id > 10;

使用幼稚的方法,我可能会跳过ID:

  • 交易1声明ID为11。
  • 交易2索赔ID 12。
  • 交易2提交。
  • 我读取了所有ID> 10。我看到12,下次我将读取所有ID> 12。我跳过了11。
  • 事务1提交。出于所有意图和目的,现在存在ID 11。

作为解决方案,我建议进行仔细检查,以确保不会提交任何中间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查询还没有看到它们?

对此问题,请忽略:

  • 手动ID插入。
  • 倒带自动增量计数器。
mysql auto-increment isolation-level read-uncommitted
1个回答
0
投票

Mysql在auto_increment期间锁定了表。

请参阅

https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html

因此,如果版本中没有错误,通常不会出现此问题。

该锁的工作方式类似于信号量/关键部分。

© www.soinside.com 2019 - 2024. All rights reserved.