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.我有问题吗?
您可以使用乐观锁定来防止将其他"陈旧"记录保存到数据库中.要启用它,您的模型需要具有lock_version默认值为的列0.
从数据库中提取记录时,会出现当前记录lock_version.当记录被修改并保存到数据库中,该数据库行有条件更新,通过限制UPDATE上lock_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)
乐观锁定的替代方法是悲观锁定,它依赖于数据库级别的表级或行级锁定.此机制将阻止对锁定行的所有访问,因此可能会对您的性能产生负面影响.
| 归档时间: |
|
| 查看次数: |
1865 次 |
| 最近记录: |