gpt4 book ai didi

ruby-on-rails - ActiveRecord:验证和写入数据库之间的并发访问

转载 作者:太空狗 更新时间:2023-10-30 01:57:17 25 4
gpt4 key购买 nike

假设我有一家在线书店,其数据模型如下所示:

enter image description here

在创建新订单之前,我想确保有足够的库存,所以我有这样的方法

def ensure_enough_in_stock
errors.add(:quantity, "not enough in stock") if quantity > book.stock
end

为了确保在保存到数据库之前调用此方法,我使用了验证:

validate :ensure_enough_in_stock, :on => create

总而言之,当我创建订单时:

  1. 验证方法被调用
  2. 新订单被写入数据库(如果验证通过)

如果在 1. 和 2. 之间,另一个进程(一个并发访问,另一个线程,...)对同一本书的库存属性进行了修改,会发生什么情况?是否引发异常?

更一般地说,如何处理在验证和保存到数据库之间发生某些事情的情况?

我认为我也应该对数据库进行验证,但我不知道它会对性能产生什么影响。有没有聪明的方法来处理这种情况?

编辑

按照说明锁定交易 here阻止对股票的写访问,但是如果我在 Book 模型中也有一个“已发布”属性,它可以取值“公共(public)”或“私有(private)”,那么会发生什么,然后我想确保你不能购买私有(private)预订。

但是,就像股票值(value)可以被外部进程改变一样,发布的值(value)也可以改变:在这种情况下,锁定没有任何帮助,不是吗?

enter image description here

最佳答案

Rails 通常将验证和保存包装在一个事务中。因此,您唯一需要做的就是在 ensure_enough_in_stock 中锁定运行查询。锁将防止数据被其他请求更改。参见 this了解如何使用锁进行查询。

关于ruby-on-rails - ActiveRecord:验证和写入数据库之间的并发访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269109/

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