我有一个带有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;
}
假设您使用 InnoDB 引擎,每个查询都在事务中执行。这意味着它可以获得一致的数据库视图,其他客户端同时进行的更改不会干扰结果。您可以将查询视为使用数据库的快照。
如果需要多个查询之间的一致性,则应使用显式事务。