Блокировка базы данных не работает должным образом с Rails и Postgres

У меня есть следующий код в модели рельсов:

foo = Food.find(...)
foo.with_lock do
  if bar = foo.bars.find_by_stuff(stuff)
    # do something with bar
  else
    bar = foo.bars.create!
    # do something with bar
  end
end

Цель состоит в том, чтобы убедиться, что Bar создаваемого типа не создается дважды.

Тестирование с блокировкой _на консоли подтверждает мои ожидания. Однако в производственной среде кажется, что в некоторых или во всех случаях блокировка работает не так, как ожидалось, и предпринимается попытка избыточного Bar --, так что блокировка with _не всегда (? )приводит к тому, что код ожидает своей очереди.

Что здесь может происходить?

обновление извините всех, кто говорил, что "блокировка foo вам не поможет"!! в моем примере изначально не было поиска по бару. это исправлено сейчас.

9
задан John Bachir 17 October 2014 в 04:32
поделиться