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