Ruby on rails 更新Sidekiq中的字段时的竞争条件
我在Sidekiq中有两个线程并发,在我的一个模型中调用了以下方法:Ruby on rails 更新Sidekiq中的字段时的竞争条件,ruby-on-rails,ruby,thread-safety,race-condition,sidekiq,Ruby On Rails,Ruby,Thread Safety,Race Condition,Sidekiq,我在Sidekiq中有两个线程并发,在我的一个模型中调用了以下方法: def update_pending update(pending_stats: self.pending_stats + 1) end 我希望当两个作业都完成时,pending_stats属性是2,但它只是1,即使两个线程都调用该方法 如何确保这两个线程的实际更新值正确?尝试使用原子操作 def update_pending increment_counter(:pending_status, 1)
def update_pending
update(pending_stats: self.pending_stats + 1)
end
我希望当两个作业都完成时,pending_stats属性是2,但它只是1,即使两个线程都调用该方法
如何确保这两个线程的实际更新值正确?尝试使用原子操作
def update_pending
increment_counter(:pending_status, 1)
end
def更新挂起
增量计数器(:挂起状态,1)
结束
这将执行以下SQL:
UPDATE ...
SET pending_status = COALESCE(pending_status, 0) + 1
WHERE ...
更新。。。
设置挂起状态=合并(挂起状态,0)+1
哪里
我看到在执行此操作时,我需要重新加载对象?否则,即使在数据库中执行了更改,对象仍保留旧值。为什么会这样?是的,如果我们关心更新后数据库中新的挂起状态,那么需要重新加载对象。因为它是一个类方法,所以它不知道要重新加载的对象。我可以这样做,因为我有对象。但是,重新加载对象会产生什么影响?