gpt4 book ai didi

ruby-on-rails - Rails 3.2 ActiveRecord 并发

转载 作者:行者123 更新时间:2023-12-02 06:38:22 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com