加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:14:42 所属栏目:百科 来源:网络整理
导读:假设我的在线图书商店的数据模型看起来像这样: 在创建新订单之前,我想确保库存中有足够的商品,所以我有一个这样的方法 def ensure_enough_in_stock errors.add(:quantity,"not enough in stock") if quantity book.stockend 为了确保在保存到数据库之前调用
假设我的在线图书商店的数据模型看起来像这样:

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

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

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

validate :ensure_enough_in_stock,:on => create

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

>调用验证方法
>将新订单写入数据库(如果验证通过)

如果在1.和2.之间,另一个进程(并发访问,另一个线程……)对同一本书的stock属性执行修改会发生什么?异常是否提出?

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

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

编辑

按照说明here锁定事务会阻止对库存的写入访问,但如果我在Book模型中也有“已发布”属性,可以采用“公共”或“私有”值,那么会发生什么,然后我想确保你不能买一本私人的书.

但是,与外部流程可以改变股票价值的方式相同,公布的价值也可以改变:在这种情况下,锁定不会有任何帮助,是吗?

解决方法

Rails通常包装验证并在事务中保存.因此,您唯一需要做的就是在ensure_enough_in_stock中使用lock运行查询.锁定将阻止数据被其他请求更改.有关如何使用锁查询,请参阅 this.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读