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

vti viacheslav.t на gmail.com
Вс Авг 5 01:23:59 PDT 2012


SELECT ... FOR UPDATE;

On 08/05/2012 10:24 AM, Alexandr Alexeev wrote:
> Если позволите, я хотел бы обратиться за помощью в вопросе, который
> имеет _очень_ посредственное отношение к 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