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