假设我有这个非常简单的控制器:
class CountersController
def inc
c = Counter.find(1)
c.value += 1
c.save!
end
end
如果两个客户端同时访问inc
方法,c.value
只能增加1吗?如果是这样,如何解决这个问题?
答案 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