1

我意识到 Rails 范围验证有时会意外跳过,从而导致重复记录。作为通知,我的服务器正在执行一些高 CPU 任务,这些任务通常会占用 6 个 CPU 内核的 80-100%。

是我的验证设置不正确,还是 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
4

1 回答 1

3

Rails 有可能插入重复记录,违反验证。

原因是 Rails 为唯一性验证执行了两个查询 - 一个检查值是否唯一,然后如果成功,另一个插入新记录。

如果另一个进程正在做某事并在这两个查询之间插入另一条记录,那么您最终会在数据库中得到重复的数据。我认为高负载意味着两个查询之间的时间会更长,从而增加了发生这种情况的可能性。

如果您真的想确保唯一性,请使用数据库级别的唯一索引。

有关更多信息,请参阅Ruby on Rails - Uniqueness(但从技术上讲,这不是一个重复的问题)。

于 2014-07-07T03:08:57.903 回答