2011-05-24 44 views
1

根據this(舊)後這些Rails 3發現者有競爭條件。類似於ActiveRecord動態基於屬性的發現者是線程安全的嗎?

User.find_or_create_by_username(:username => 'uuu', :password => 'xxx') 

根據帖子可能會在某些條件下創建兩條記錄。

這對於Rails 3.0+還是相關的嗎?謝謝

+0

還有一個問題 - 感嘆號版本是不可能的。有沒有一種方法可以強制這些在創建時報告錯誤? – lzap 2011-05-24 09:14:00

回答

2

是的。在執行第一條語句和創建對象的時間量中,可以並行執行第二條語句。 沒有排他鎖。

防止這種情況的最好方法是在模型中添加一個唯一驗證,並在數據庫中添加一個唯一索引。這樣,如果您嘗試使用相同的字段創建兩條記錄,則數據庫將引發錯誤。

+0

謝謝。我認爲他們改變了它,因爲active_record/dynamic_finder_match.rb是新的。 – lzap 2011-05-24 08:59:35