У меня есть приложение 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, чтобы сделать его лучше.