我有10个单独的php chron作业运行,使用
从同一个表中一次选择100条记录SELECT `username` FROM `data` where `id` <> = '' limit 0,100
如何确保每个记录集都是唯一的?有没有办法确保每个chron作业不会选择相同的100条记录?
如果有帮助,用户名是唯一的。
由于
乔纳森
答案 0 :(得分:2)
您可以选择不同的100条记录:
limit 100,100
,limit 200,100
...
或随机选择100:
...FROM
的数据where
ID为<> = '' ORDER BY RAND() LIMIT 0,100
如果您想确保不会选择两次记录,则必须标记该记录(“使其变脏”),以便其他cron作业只能查询非记录已经选择了。只需添加另一个名为chosen
的布尔键,并在选择给定记录后将其标记为true。您必须逐个运行cron作业,或使用锁定或互斥机制来确保它们不会并行运行并相互竞争。
答案 1 :(得分:1)
你可以做的是'标记'每个工作将要使用的记录 - 诀窍是确保在标记它们时没有竞争条件。这是一种方法。
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个数据行时,通过在作业中插入一行并获取自动生成的ID来获取唯一的job_id。以下是如何在mysql命令行客户端中执行此操作,以便轻松了解它如何适应代码:
insert into job (job_id) values(0);
set @myjob=last_insert_id();
然后,标记当前为0的一百行
update data set job_id=@myjob where job_id=0 limit 100;
现在,你可以花时间处理job_id = @ myjob所有的行,知识中没有其他进程可以触及它们。
毫无疑问,您需要根据自己的问题进行定制,但这说明了如何使用MySQL的简单功能来避免竞争访问相同记录的并行进程中的竞争条件。