我有一个Web界面和一个运行相同应用程序的移动应用程序,用户可以在其中创建内容(保存带有标题的图像集合)。这些内容是特定于用户的,并存储在运行带有MySQL的Rails Restful WS的Web服务器中。
这是内容的表格:
galleries(id, title, serialized_images, user_id, created_at, updated_at)
我在每个内容中使用版本号,以跟踪新的插入/更新并同步移动APP而不必每次都发回所有内容。每次新的更新/插入后,此数字会自动递增,以便移动APP仅检索大于最新版本的内容。此version_number存储在支持表中,如下所示:
gallery_versions(is, gallery_id, version)
操作按以下顺序执行:
问题是并发插入语句。如果同一个用户同时从Web和应用程序创建新内容,则存在2个对象获得相同版本号的风险。
我想知道锁定select max,并在更新version_number后释放此锁。但是使用Ruby 1.8.7我不知道该怎么做。
你有什么想法吗?
答案 0 :(得分:0)
选择更新将实例化行级别锁定可能是答案。 ruby 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