Sidekiq工作进程没有正确更新数据库记录

时间:2016-03-30 21:18:02

标签: ruby-on-rails postgresql sidekiq

我有一个sidekiq工作人员批量处理某些系列的任务。完成作业后,它会更新有关任务成功/失败的跟踪器表。每个批处理都有一个唯一的标识符,该标识符将传递给工作者脚本,工作进程会查询该表以获取此唯一ID,并通过类似于以下内容的activerecord查询更新该特定行:

cpr = MODEL.find(tracker_unique_id)

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

我注意到,即使我可以从sidekiq日志和另一个结果表中看到x个任务已经完成运行,跟踪器只能获得一组任务运行的记录。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您的update_attributes调用具有竞争条件,因为您无法安全地增加。多个线程会相互踩踏。您必须执行正确的UPDATE SQL语句。

  

更新模型set attempts = attempts + 1 where tracker_unique_id =?