Как сделать обновления ActiveRecord потокобезопасными в Rails?
У меня есть очередь заданий Resque. Каждое задание имеет пакет событий для обработки. Рабочий обработает задания и посчитает количество событий, произошедших за каждую минуту. Он использует ActiveRecord, чтобы получить "datapoint" на эту минуту, добавить количество событий к нему и сохранить.
Когда несколько человек обрабатывают эту очередь, я полагаю, что существует проблема параллелизма. Я думаю, что существует условие состязания между получением точки данных из базы данных, добавлением правильного количества и обновлением до нового значения. Я посмотрел на транзакции, но я думаю, что это помогает только в случае сбоя запроса.
Мой текущий обходной путь использует только 1 Resque Worker. Я бы хотел масштабировать и обрабатывать задания быстрее. Есть идеи?
Редактировать: у меня изначально были проблемы с поиском ключевых слов для поиска в Google, но благодаря Робину я нашел ответ на свой вопрос здесь.
Правильный ответ - использовать increment_counter
или же update_counters
если вам нужно увеличить несколько атрибутов или значение, отличное от +1. Оба они являются модельными классами.