1

我意识到,Rails作用域验证有时会意外跳过这会导致重复的记录。作为通知,我的服务器正在执行一些高CPU任务,这些任务定期填充6个CPU核心的80-100%。Rails模型范围唯一性验证意外跳过高CPU负荷

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

回答

3

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

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

如果另一个进程正在执行某些操作,并在之间插入另一个记录,那么最终会在数据库中出现重复数据。我认为高负载意味着两次查询之间的时间会更长,增加发生这种情况的可能性。

如果您确实希望确保唯一性,请使用数据库级唯一索引。

查看Ruby on Rails - Uniqueness了解更多信息(但这在技术上并不重复)。

+0

谢谢sevenseacat,所以这是一个问题。我将使用数据库级唯一索引。 – tomodian