【发布时间】: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