我有10个单独的php chron作业在运行,它们使用一次从同一个表中选择100条记录
SELECT `username` FROM `data` where `id` <> = '' limit 0,100
如何确保这些记录集中的每一个都是唯一的?有没有办法确保每个chron作业不会选择相同的100条记录?
username是唯一的,如果有帮助的话。
感谢
Jonathan
-
您可以选择不同的100条记录:
limit 100,100
、limit 200,100
。。。 -
或者随机选择100:
...FROM
数据where
id<> = '' ORDER BY RAND() LIMIT 0,100
-
如果你想确保一条记录不会被选择两次,你必须标记该记录("使其变脏"),这样其他cron作业就只能查询尚未选择的记录。只需添加另一个名为
chosen
的布尔键,并在选择给定记录后将其标记为true。您必须逐个运行cron作业,或者使用锁定或互斥机制来确保它们不会并行运行并相互竞争。
你可以做的是"标记"每个作业将要使用的记录——诀窍是确保标记它们时没有种族条件。这里有一种方法。
create table job
(
job_id int not null auto_increment,
#add any other fields for a job you might want
primary key(job_id)
);
# add a job_id column to data
alter table data add column job_id not null default '0', add index(job_id);
现在,当您想要处理100个数据行时,可以通过在job中插入一行并获得自动生成的id来获得唯一的job_id
insert into job (job_id) values(0);
set @myjob=last_insert_id();
然后,标记100行当前为0
update data set job_id=@myjob where job_id=0 limit 100;
现在,您可以慢慢来处理job_id=@myjob的所有行,因为您知道没有其他进程会接触到它们。
毫无疑问,您需要对此进行调整以适应您的问题,但这说明了如何使用MySQL的简单功能来避免并行进程之间竞争访问相同记录的竞争条件。