ruby-on-rails - Rails 3.2 ActiveRecord 并发

标签 ruby-on-rails activerecord concurrency

我有一个应用程序是任务管理器。

每个用户都可以选择分配给自己的新任务。

2个用户同时接受同一个任务会不会有并发问题?

我的代码是这样的:

if @user.task == nil
  @task.user = @user
  @task.save
end

如果 2 个不同的用户,在 2 个不同的机器上同时打开此 url。我会有问题吗?

最佳答案

您可以使用 optimistic locking以防止将其他“陈旧”记录保存到数据库中。要启用它,您的模型需要有一个默认值为 0lock_version 列。

当从数据库中获取记录时,当前的 lock_version 也会随之而来。当记录被修改并保存到数据库时,数据库行将有条件地更新,方法是将 UPDATE 限制在获取记录时存在的 lock_version 上。如果它没有改变,UPDATE 将增加 lock_version。如果它已更改,则更新将不执行任何操作,并会引发异常 (ActiveRecord::StaleObjectError)。这是 ActiveRecord 的默认行为,除非如下关闭:

ActiveRecord::Base.lock_optimistically = false

您可以(可选)使用 lock_version 以外的列名。要使用自定义名称,请将如下一行添加到您的模型类中:

set_locking_column :some_column_name

乐观锁定的替代方法是 pessimistic locking ,它依赖于数据库级别的表级或行级锁。此机制将阻止对锁定行的所有访问,因此可能会对您的性能产​​生负面影响。

关于ruby-on-rails - Rails 3.2 ActiveRecord 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13069788/

相关文章:

sql - Codeigniter Active Record - 删除不在数组中的位置

快速调用没有返回值的异步函数

c - 读取内存屏障如何在存在中断的情况下工作?

ruby-on-rails - 如何在模型中设置默认值? -- 在 Ruby on Rails 3.1 中

mysql - 获取带有 EST 时区时间的游戏

sql - rails : Using jquery tokeninput (railscast #258) to create new entries

javascript - 即使捕获到失败,也会出现控制台错误?

ruby-on-rails - 如何防止 has_and_belongs_to_many 删除选项删除 Rails 中正在使用的记录?

ruby-on-rails - 如何在没有关联数据库表的情况下 RSpec 共享 ActiveRecord 模块?

MongoDB 文档操作是原子的和隔离的,但它们是否一致?