2013-08-06 22 views
0

我有一個web界面和一個移動應用程序,運行相同的應用程序,用戶可以在其中創建內容(保存帶有標題的圖像集合)。這些內容是用戶特定的,並存儲在運行帶有MySQL的Rails Restful WS的Web服務器中。Ruby 1.8.x,鎖定select語句和併發問題

這是內容的表:

galleries(id, title, serialized_images, user_id, created_at, updated_at) 

我使用的每一個內容中的版本號,跟蹤新的插入/更新,無發回,每次都同步內容的移動應用程序。這個數字在每次新的更新/插入後自動遞增,以便移動APP只檢索大於最新版本的內容。這VERSION_NUMBER存儲到支承臺這樣的:

gallery_versions(is, gallery_id, version) 

的操作順序進行:

  1. 插入圖庫對象
  2. 運行的觀察者認爲:
    1. 從支持表中選擇max version_number
    2. 增加ver sion_number到支撐臺

的問題是併發的INSERT語句。如果同一用戶從網絡和應用程序同時創建新內容,則有2個對象獲得相同版本號的風險。

我想知道如何鎖定select max,並在version_number更新後釋放此鎖。但對於Ruby 1.8.7,我不知道該怎麼做。

你有什麼想法嗎?

+0

什麼阻止你使用'updated_at'列,以確定更新的資料? – nTraum

+0

什麼阻止你升級到Ruby的受支持版本「Ruby 1.8.y已經死了,Ruby 1.8.7已經存在! – vgoff

+0

我無法更新Ruby版本,我不能依賴updated_at列......不會解決我的併發問題。有了ruby 1.9,有一個很好的方法叫做「with_block」:在Ruby 1.8.x中是否有類似的功能? –

回答

0

選擇更新將實例化行級鎖可能是答案。紅寶石1.8.7例如:

Account.transaction do 
    # select * from accounts where name = 'shugo' limit 1 for update 
    shugo = Account.find(:first, :conditions => "name = 'shugo'", :lock => true) 
    yuko = Account.find(:first, :conditions => "name = 'yuko'", :lock => true) 
    shugo.balance -= 100 
    shugo.save! 
    yuko.balance += 100 
    yuko.save! 
end 

更多的信息在這個網站: http://www.rubydox.net/class/activerecord/2.3.2/ActiveRecord%3A%3ALocking%3A%3APessimistic