[Moscow.pm] Получение задач из РСУБД

Alexandr Alexeev afiskon на gmail.com
Вс Авг 5 00:24:23 PDT 2012


Если позволите, я хотел бы обратиться за помощью в вопросе, который
имеет _очень_ посредственное отношение к 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 например.

Как бы вы посоветовали решить проблему?


Подробная информация о списке рассылки Moscow-pm