Рельсы ActiveRecord выставляет условия гонки? - PullRequest
0 голосов
/ 13 марта 2012

Предположим, у меня есть очень простой контроллер:

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

Если два клиента одновременно получают доступ к методу inc, возможно ли, что c.value увеличивается только на 1? Если да, то как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Если вы сделаете это следующим образом:

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

Он заблокирует строку в базе данных при обновлении.

0 голосов
/ 13 марта 2012

лучше сделать инкремент в базе данных следующим образом:

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
...