更新Sidekiq中的字段时的竞争条件

时间:2014-07-11 20:23:59

标签: 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 个答案:

答案 0 :(得分:2)

尝试使用increment_counter这是一个原子操作。

    def update_pending
      increment_counter(:pending_status, 1)
    end

这将执行以下SQL:

    UPDATE ...
    SET pending_status = COALESCE(pending_status, 0) + 1
    WHERE ...