Rails 3.2 ActiveRecord并发

Nic*_*lis 2 concurrency activerecord ruby-on-rails

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

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

如果2个用户同时接受相同的任务,是否存在并发问题?

我的代码看起来像这样:

if @user.task == nil
  @task.user = @user
  @task.save
end
Run Code Online (Sandbox Code Playgroud)

如果有2个不同的用户,则在2台不同的机器上同时打开此URL.我有问题吗?

Pin*_*nyM 5

您可以使用乐观锁定来防止将其他"陈旧"记录保存到数据库中.要启用它,您的模型需要具有lock_version默认值为的列0.

从数据库中提取记录时,会出现当前记录lock_version.当记录被修改并保存到数据库中,该数据库行有条件更新,通过限制UPDATElock_version是存在当记录是牵强.如果它没有改变,UPDATE则会增加lock_version.如果它已更改,更新将不执行任何操作,并将引发异常(ActiveRecord::StaleObjectError).这是ActiveRecord的默认行为,除非关闭,如下所示:

ActiveRecord::Base.lock_optimistically = false
Run Code Online (Sandbox Code Playgroud)

您可以(可选)使用除以外的列名lock_version.要使用自定义名称,请在模型类中添加如下所示的行:

set_locking_column :some_column_name
Run Code Online (Sandbox Code Playgroud)

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