Ruby on Rails - безопасна ли транзакция встречного кэша?
Это решит проблему обновления двух человек?
Я погуглил и посмотрел в api но ничего не нашел
Рельсы 3+, Рубин 1.9.3
2 ответа
При использовании counter_cache вставка записи и обновление счетчика выполняются в одной транзакции. Но это не гарантирует атомарность операции. Возможно, вам придется "заблокировать" свою запись в дополнение, чтобы избежать проблемы обновления двух человек.
Смотрите эту прекрасную статью. Речь идет о самоцвете redis-objects, но первые две части прекрасно объясняют проблему и решение с ActiveRecord.
Краткий ответ: нет. Как упоминает Седрик, Rails обновляет counter_cache
внутри транзакции, поэтому, если вы скажете, что есть фоновый процесс, который обновляет ту же запись, вы обнаружите, что получите тупиковые ошибки, если вы не запустите оба обновления, используя with_lock
блок на запись.
Полученные ответы не кажутся правильными, по крайней мере, для Rails 5.x, потому что он будет выполнять SQL UPDATE, который является атомарным.
UPDATE .... SET counter = counter + 1