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

Ruby 1.8.x,锁定select语句和并发问题,ruby,concurrency,Ruby,Concurrency,我有一个web界面和一个运行相同应用程序的移动应用程序,用户可以在其中创建内容(保存带有标题的图像集合)。这些内容是特定于用户的,存储在运行Rails Restful WS with MySQL的web服务器中 这是内容的表: galleries(id, title, serialized_images, user_id, created_at, updated_at) 我在每个内容中使用版本号,以跟踪新的插入/更新,并同步移动应用程序,而无需每次发回所有内容。此数字在每次更新/插入后自动递增

我有一个web界面和一个运行相同应用程序的移动应用程序,用户可以在其中创建内容(保存带有标题的图像集合)。这些内容是特定于用户的,存储在运行Rails Restful WS with MySQL的web服务器中

这是内容的表:

galleries(id, title, serialized_images, user_id, created_at, updated_at)
我在每个内容中使用版本号,以跟踪新的插入/更新,并同步移动应用程序,而无需每次发回所有内容。此数字在每次更新/插入后自动递增,以便移动应用程序仅检索大于最新版本的内容。此版本号存储在支持表中,如下所示:

gallery_versions(is, gallery_id, version)

操作按以下顺序执行:

  • 插入库对象
  • 运行一个观察者:
  • 从支持表中选择最大版本号
  • 在支持表中增加版本号
  • 问题是并发insert语句。如果同一用户同时从web和应用程序创建新内容,则存在两个对象获得相同版本号的风险

    我想锁定select max,并在更新版本号后释放此锁。但是对于Ruby 1.8.7,我不知道如何做到这一点


    你知道吗?

    选择更新,它将实例化一个行级锁可能就是答案。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
    
    更多信息请访问此网站:

    是什么阻止您使用列中的
    updated\u来识别更新的数据?是什么阻止您升级到受支持的Ruby版本“Ruby 1.8.y死了,Ruby 1.8.7万岁!由于许多原因,我无法更新Ruby版本。我不能依赖更新的专栏。。。这并不能解决我的并发问题。对于ruby 1.9,有一个很棒的方法叫做“With_block”:ruby 1.8.x上有类似的函数吗?我认为它可以解决你的问题,因为你不再需要一个单独的表了。你能解释一下你的想法吗?将有两个不同的记录。这个问题代表插入前MAX(版本号)的SELECT语句。