【发布时间】:2014-05-08 12:42:47
【问题描述】:
我有一个具有唯一性验证的模型,例如:
class CurriculumRequirement < ActiveRecord::Base
belongs_to :student
belongs_to :curriculum_sequence
validates :student_id,
uniqueness: { scope: [:curriculum_sequence_id] }
end
问题是,尽管进行了验证,但以某种方式重复的记录被插入到我的数据库中。添加这些记录的地方发生在 sidekiq 后台工作人员中:
student.curriculum_requirements.where(curriculum_sequence: sequence).first_or_create
我认为正在发生的事情是 2 个或更多工作人员正在执行相同的代码并保存记录。有没有办法在这条记录上加锁或其他东西,这样我就不会得到重复?
【问题讨论】:
-
sidekiq background worker是的,当它在几个线程中工作时会发生这种情况。您应该包括一些储物柜,或设置 sidekiq 以在一个线程中工作。 -
如果是储物柜,您可以使用
Model.transaction { ... }link。如果有帮助,请告诉我,我将其发布为答案。 -
sidekiq docs 上也有一些信息,但我认为你可以避免这种情况。交易应该足够了。
-
为什么不使用数据库唯一约束?
标签: ruby-on-rails ruby validation sidekiq