场景是:
执行一个脚本文件,将符合条件(包含status=0)的记录的status字段改成1。几百万的记录的表。
很显然,不能一次get出数据,而是使用循环的方式,每次获取小量数据,修改状态。逐步的遍历整个表
offset = 0,num = 5000;
for{
list = select * from 表 where condition limit offset num;
逻辑处理{ list内符合条件的数据,status = 1}
offset += count(list)
}
这种方式存在bug。
list内的数据每次修改n个数据时,下一次的limit会遗漏掉n个数据。
例如: 第一次获取 limit[0,5000),将其中的10条数据status = 1。则下一次,limit[5000,10000)时候,此时会遗漏掉10条数据,因此前5000个符合条件的记录以及被
更新过了。
因此,如果存在数据修改的遍历,offset+=( count(list) - count(修改的量) )