Rails的ActiveRecord暴露了竞争条件?

时间:2012-03-13 09:56:13

标签: ruby-on-rails activerecord race-condition

假设我有这个非常简单的控制器:

class CountersController
  def inc
    c = Counter.find(1)
    c.value += 1
    c.save!
  end
end

如果两个客户端同时访问inc方法,c.value只能增加1吗?如果是这样,如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果你这样做:

def inc
  c = Counter.find(1)
    c.with_lock do
      c.value += 1
      c.save!
    end
  end
end

它将在更新时锁定数​​据库中的行。

答案 1 :(得分:0)

最好像这样在数据库中进行增量:

Counter.update_counters id, :value => amount to increment

所以对你来说就像这样

Counter.update_counters 1, :value => 1

创建以下SQL语句

UPDATE "counters" SET "value" = COALESCE("value", 0) + 1 WHERE "counters"."id" = 1