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
Другие вопросы по тегам