2016-03-30 2 views
0

У меня есть сторонний рабочий, который обрабатывает определенную серию задач в пакетном режиме. После завершения задания он обновляет таблицу трекера об успешности/сбое задачи. Каждая партия имеет уникальный идентификатор, который передается в сценарий рабочего и рабочий процесс запрашивает эту таблицу для этого уникального идентификатора и обновление этой конкретной строки через запрос ActiveRecord аналогично:Рабочий процесс Sidekiq не обновляет записи базы данных правильно

cpr = MODEL.find(tracker_unique_id) 

cpr.update_attributes(:attempted => cpr[:attempted] + 1, :success => cpr[:success] + 1) 

То, что я заметил, что трекер получает запись только одного набора задач, хотя я могу видеть из журнала sidekiq и другой таблицы результатов, что x количество завершенных задач завершено.

Любой может мне помочь?

ответ

0

У вашего вызова update_attributes есть условие гонки, так как вы не можете безопасно увеличивать его. Несколько потоков будут топать друг на друга. Вы должны сделать правильный оператор SQL UPDATE.

обновление модели установлено попытка = попытка + 1 где tracker_unique_id =?

+0

Да, я думаю, что это он, –

+1

я был в состоянии получить его правильно работать с помощью этого вместо Model.increment_counter (: попытка СЛР [: идентификатор]) –