Проверка уникальности на уровне модели 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 - Уникальность для получения дополнительной информации (но технически это не дублирующий вопрос).

Другие вопросы по тегам