我有一个sidekiq工作人员批量处理某些系列的任务。完成作业后,它会更新有关任务成功/失败的跟踪器表。每个批处理都有一个唯一的标识符,该标识符将传递给工作者脚本,工作进程会查询该表以获取此唯一ID,并通过类似于以下内容的activerecord查询更新该特定行:
cpr = MODEL.find(tracker_unique_id)
cpr.update_attributes(:attempted => cpr[:attempted] + 1, :success => cpr[:success] + 1)
我注意到,即使我可以从sidekiq日志和另一个结果表中看到x个任务已经完成运行,跟踪器只能获得一组任务运行的记录。
任何人都可以帮助我吗?
答案 0 :(得分:0)
您的update_attributes调用具有竞争条件,因为您无法安全地增加。多个线程会相互踩踏。您必须执行正确的UPDATE SQL语句。
更新模型set attempts = attempts + 1 where tracker_unique_id =?