使用Rails 2.3修改并发记录

时间:2015-03-03 14:05:49

标签: ruby-on-rails ruby concurrency

在Rails 2.3.x应用程序中,我希望每次用户点击特定链接时都更新记录。

例如。访问www.sito.com/tracks/1我更新了这样的记录:

r = Record.find(params[:id])
r.views = r.views + 1
r.save

以下是我的疑惑:

  • 如果2个用户同时访问该链接,会发生什么?可能应用程序已经在更新记录......但是第二个请求会发生什么?

更新

使用乐观锁定的组合,我这样做了:

添加了" lock_version"列到记录表

将代码更改为:

    Record.transaction do
        begin
          @record.update_attributes(:views => @record.views + 1)
        rescue ActiveRecord::StaleObjectError
          retry
        end
    end

1 个答案:

答案 0 :(得分:0)

取决于。

如果你很幸运,两个请求都将正常处理,计数器将增加两次。

但是,很可能会丢失一个或另一个增量。您正在查看的特定方案正式描述为Race Condition,是多线程应用程序中的标准复杂功能。

这是一个很好的起点:

How do I avoid a race condition in my Rails app?