2010-08-26 191 views
1
class State < ActiveRecord::Base 
    validates_uniqueness_of :identifier 
end 

現在假定有兩個正在運行的進程可以同時插入其中兩個記錄。乘客就是一個很好的例子。這是一個人爲的:防止多個活動記錄進程插入重複記錄

State.find_by_identifier("UNIQ").delete rescue nil 
while Time.now < Time.now.change(:hour => 17, :min => 00, :sec => 15) 
    sleep 0.001 
end 
ActiveRecord::Base.transaction do 
    s = State.new;s.identifier = "UNIQ" 
    s.save! 
end 
s.valid? 

這個想法是,我們改變時間值將在未來略有變化。然後複製/粘貼到兩個不同的控制檯。

最終目標是讓他們在同一時間「釋放」。怎麼了?他們都成功創建了一個新的狀態對象,並且最終都返回false。

Soooo,我該如何阻止這種情況發生?

爲什麼它值得我使用MySQL和表是InnoDB。

回答

0

您使用#find_or_create輔助方法,除了適當的驗證,並在數據庫級別唯一索引:

# In a migration 
add_index :states, :identifier, :unique => true 

class State < ActiveRecord::Base 
    validates_uniqueness_of :identifier 
end 

State.find_or_create_by_identifier("UNIQ") 

,將與任何適配器配合使用。

+0

我想知道爲什麼這個答案被拒絕?它看起來很完整,並且確保沒有任何事情能夠通過數據庫服務器的驗證。 – 2011-04-13 16:42:53