Ruby 1.8.x,锁定select语句和并发问题

时间:2013-08-06 11:26:06

标签: ruby concurrency

我有一个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)

操作按以下顺序执行:

  1. 插入图库对象
  2. 运行观察员:
    1. 从支持表中选择max version_number
    2. 将version_number增加到支持表
  3. 问题是并发插入语句。如果同一个用户同时从Web和应用程序创建新内容,则存在2个对象获得相同版本号的风险。

    我想知道锁定select max,并在更新version_number后释放此锁。但是使用Ruby 1.8.7我不知道该怎么做。

    你有什么想法吗?

1 个答案:

答案 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