2014-09-10 3 views
0

У меня есть приложение node.js + express 4 + socket.io + postgresql (с knex.js). Его цель - отправить задачи подключенным клиентам через socket.io для обработки. Это, как я реализовал запрос для выборки новой задачи для вычисления:Расы при использовании node.js, postgresql и knex.js

update data 
    set status='computing' 
    where id = (select id from data where status = 'new' limit 1) 
    returning * 

Я использовал update с опцией returning, чтобы гарантировать, что операция извлечения задачи является атомарной. Проблема в том, что при наличии нескольких клиентов они могут запросить задачу несколько раз.

Это происходит только при использовании библиотеки knex.js для построения запросов. Я подозреваю, что причина заключается в том, что knex.js сохраняет пул соединений открытым. При отладке кажется, что мое приложение нажимает метод, который выполняет запрос несколько раз перед любым из обещаний с результирующим результатом (а затем для всех из них одинаково). При подключении ~ 20 клиентов до восьми человек могут получить одну и ту же задачу в моем приложении.

В начале я использовал модуль pg-query, который только создает соединение db каждый раз, когда он вызывается, и все работает отлично.

EDIT: Теперь я узнал, что есть гонки со вторым методом. Просто они встречаются гораздо реже.

Итак: что я делаю неправильно? Как я могу улучшить свой код/​​db, чтобы сделать его лучше.

ответ

Смежные вопросы