【问题标题】:Concurrent record modification with Rails 2.3Rails 2.3 的并发记录修改
【发布时间】:2015-03-03 14:05:48
【问题描述】:

在 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

【问题讨论】:

  • 您的问题和可能的解决方案描述了here
  • 我认为悲观锁定是我想要的。但我试图了解如何实现它。我可以将上述指令包装到“事务”块中,对吧?那么……如果有 2 个请求进来,会发生什么?
  • 还有一个需要考虑的问题。如果更新指令被做成“渲染”视图会怎样?我没有明确的“查找”......但我呈现了一个集合,并且对于我称之为“update_attributes”的每个项目

标签: ruby-on-rails ruby concurrency


【解决方案1】:

视情况而定。

如果幸运的话,两个请求都会正常处理,并且计数器会增加两次。

不过,很可能会丢失一个或另一个增量。您现在正在查看的特定场景被正式描述为 Race Condition,并且是多线程应用程序中的标准复杂功能。

这是一个很好的起点:

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

【讨论】:

  • 我仔细阅读了您提供的链接。我已经更新了代码。你怎么看?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多