<p>Как-то давно решал схожую задачу.<br>
Сначала делал UPDATE таблицы, а потом выбирал нужные записи.<br>
UPDATE jobs SET worker=$worker WHERE worker='' AND ....;<br>
SELECT ... WHERE worker=$worker;</p>
<p> После выполнения пачки заданий выставлял им статус "выполнено"<br>
+ нужен механизм, который освобождает взятые, но не сделанные задачи.</p>
<p>05.08.2012 13:56 пользователь "Михаил Монашёв" <<a href="mailto:postmaster@softsearch.ru">postmaster@softsearch.ru</a>> написал:<br>
><br>
> Здравствуйте, Alexandr.<br>
><br>
> > Если позволите, я хотел бы обратиться за помощью в вопросе, который<br>
> > имеет _очень_ посредственное отношение к Perl.<br>
><br>
> > Есть база, в базе хранятся задачи, задачи объединяются в группы. Схема<br>
> > БД примерно такая - в табличке groups хранится group_id, group_desc и<br>
> > last_task_id, а в табличке tasks - task_id, group_id и<br>
> > task_description. При выборке очередной порции заданий выполняются<br>
> > такие запросы:<br>
><br>
> > SELECT * FROM tasks WHERE group_id =$group AND task_id > $start ORDER<br>
> > BY task_id LIMIT 100;<br>
> > UPDATE groups SET last_task_id =<br>
> > $максимальный_id_полученный_в_пред_запросе WHERE group_id = $group_id;<br>
><br>
> > Проблема заключается в том, что если почти одновременно начать<br>
> > выполнять эти запросы, будут получены одни и те же задачи.<br>
><br>
> > Один из способов решения этой проблемы заключается в введении<br>
> > специальной таблички mutex, которая будет лочится на время выполнения<br>
> > запроса. Но этот способ плох хотя бы тем, что он не позволяет выбирать<br>
> > задачи одновременно из нескольких групп. Также можно поднять сервер<br>
> > блокировок (сойдет Memcached или Redis). Или просто переписать все и<br>
> > использовать ZeroMQ например.<br>
><br>
> > Как бы вы посоветовали решить проблему?<br>
><br>
> <a href="http://dev.mysql.com/doc/refman/4.1/en/lock-tables.html">http://dev.mysql.com/doc/refman/4.1/en/lock-tables.html</a><br>
><br>
> --<br>
> С уважением,<br>
>  Михаил                          mailto:<a href="mailto:postmaster@softsearch.ru">postmaster@softsearch.ru</a><br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org">http://moscow.pm.org</a><br>
</p>