Проверка уникальности на уровне модели Rails неожиданно пропущена при высокой загрузке процессора
Я понял, что валидация в Rails иногда неожиданно пропускалась, что приводило к дублированию записи. Как замечание, мой сервер выполняет задачи с высокой загрузкой ЦП, которые регулярно заполняют 80-100% из 6 ядер ЦП.
Мой параметр проверки неверен или Rails имеет возможность вставлять дублированные записи в случае высокой нагрузки среды?
class User < ActiveRecord::Base
has_many :messages
end
class Message < ActiveRecord::Base
belongs_to :user
validates :message, presence: true, uniqueness: {scope: :user_id}, format: {without: /\s/}
end
1 ответ
Rails имеет возможность вставлять дубликаты записей, нарушая валидацию.
Причина в том, что Rails выполняет два запроса для проверки уникальности - один для проверки уникальности значения, а затем, если это удастся, другой для вставки новой записи.
Если другой процесс что-то делает и вставляет другую запись между этими двумя запросами, вы получите дубликаты данных в базе данных. Я предполагаю, что высокая нагрузка означает, что время между двумя запросами будет больше, что увеличивает вероятность этого.
Если вы действительно хотите обеспечить уникальность, сделайте это с уникальным индексом на уровне базы данных.
См. Ruby on Rails - Уникальность для получения дополнительной информации (но технически это не дублирующий вопрос).