我正在深入研究Rails 4,並且試圖瞭解如何在多個數據庫連接訪問模型數據時安全地訪問模型數據。我有一些比賽制定邏輯找到最早用戶在隊列中,從隊列中刪除該用戶,並使用戶返回...Rails應用程序中的實例可以在檢查時由其他數據庫連接修改嗎?
# UserQueue.rb
class UserQueue < ActiveRecord::Base
has_many :users
def match_user(user)
match = nil
if self.users.count > 0
oldest = self.users.oldest_in_queue
if oldest.id != user.id
self.users.delete(oldest)
match = oldest
end
end
end
end
如果兩個不同的線程中執行大約在同一時間該match_user
方法,是否有可能找到相同的oldest
用戶並嘗試從隊列中刪除它,並將其返回給調用者?如果是這樣,我該如何預防?
我看着交易,但他們似乎並沒有成爲一個解決方案,因爲有在此情況下(隊列)被修改只有一個型號的。
在此先感謝您的智慧!
謝謝,實質。如果我正確地理解了這一點,聽起來像我只需要將我的代碼包裝在開始/救援塊中,並添加處理隊列第二次修改的情況所需的業務邏輯?另外,在閱讀指南後,看起來我也可以使用「悲觀」鎖定,並將代碼包裝在交易中並呼叫鎖定!自我(隊列實例)?再次感謝! – BeachRunnerFred 2014-10-18 01:02:08