Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更新Sidekiq中的字段时的竞争条件_Ruby On Rails_Ruby_Thread Safety_Race Condition_Sidekiq - Fatal编程技术网

Ruby on rails 更新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)

我在Sidekiq中有两个线程并发,在我的一个模型中调用了以下方法:

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 哪里
我看到在执行此操作时,我需要重新加载对象?否则,即使在数据库中执行了更改,对象仍保留旧值。为什么会这样?是的,如果我们关心更新后数据库中新的挂起状态,那么需要重新加载对象。因为它是一个类方法,所以它不知道要重新加载的对象。我可以这样做,因为我有对象。但是,重新加载对象会产生什么影响?