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

Jack of Shadows somerandomlogin на gmail.com
Вс Авг 5 01:11:52 PDT 2012


Так может залочить таблицу/колонку на чтение перед выполнением обоих запросов?


2012/8/5 Alexandr Alexeev <afiskon at gmail.com>:
> Если позволите, я хотел бы обратиться за помощью в вопросе, который
> имеет _очень_ посредственное отношение к 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 mailing list
> moscow-pm at pm.org | http://moscow.pm.org


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