0

我有一个 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. 从支持表中选择最大版本号
    2. 将 version_number 增加到支持表中

问题是并发插入语句。如果同一用户同时从 Web 和应用程序创建新内容,则存在 2 个对象获得相同 version_number 的风险。

我想锁定选择最大值,并在更新 version_number 后释放此锁定。但是对于 Ruby 1.8.7,我不知道该怎么做。

你有什么想法吗?

4

1 回答 1

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

于 2013-08-06T14:50:46.907 回答