如果在查询执行期间插入新行,在查询中的索引列上使用 ORDER BY 是否会导致问题

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

我有一个带有id的表

Users
,这个表有一百万条记录或更多。因此,当从表中获取数据时,我使用带有偏移和限制的批处理来减少服务器上的负载。

我的问题是,如果我们正在执行以下从表中获取数据的查询,同时会出现一个在表中插入记录的查询。返回的数据会不会有一致性问题。查询将一直执行到表中所有数据行都执行完毕。

查询:

SELECT * FROM Users ORDER BY id LIMIT 10000 OFFSET x;

将运行查询以返回表中的所有条目。 示例代码:

async function fetchDataInBatches(model, whereClause, batchSize = 1000) {
  let offset = 0;
  let moreDataAvailable = true;
  let allData = [];
  while (moreDataAvailable) {
    const results = await model.findAll({
      where: whereClause,
      limit: batchSize,
      offset: offset,
      order: [['id', 'ASC']], 
    });
    if (results.length === 0) {
      moreDataAvailable = false; 
      break;
    }
    allData = allData.concat(results);
    offset += batchSize;
  }
  return allData;
}
sql mysql sql-order-by
1个回答
0
投票

假设您使用 InnoDB 引擎,每个查询都在事务中执行。这意味着它可以获得一致的数据库视图,其他客户端同时进行的更改不会干扰结果。您可以将查询视为使用数据库的快照。

如果需要多个查询之间的一致性,则应使用显式事务。

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