gpt4 book ai didi

ruby-on-rails - 如何处理 Rails 中复杂的自定义验证的竞争条件?

转载 作者:行者123 更新时间:2023-12-02 03:34:41 24 4
gpt4 key购买 nike

人们正在使用我们的 Rails 网络应用程序进行预订。

当提供预订时,我们的流量就会很高,有时,当只剩下一名游客时,两名游客却获得了有效的预订。

我的验证有点复杂,但这里有一个简化版本,可以让您了解正在检查的部分内容:

validate :time_availability

def time_availability
if Reservation.where(date: date, arrival_time: arrival_time).count >= ReservationMax.for(date, arrival_time)
errors.add(:arrival_time, "This time is not available")
end
end

当其中一个请求保存会使另一个请求无效时,您如何确保两个同时请求不会同时保存?

最佳答案

由于潜在的竞争条件,我不确定模型验证是否会在这里工作 - 相反,您需要将其包装在事务中并向后执行:

date, arrival_time = @reservation.date, @reservation.arrival_time
Reservation.transaction do
@reservation.save!
unless Reservation.where(date: date, arrival_time:arrival_time).count >= ReservationMax.for(date, arrival_time)
raise ActiveRecord::Rollback, "This time is not available"
end
end

if @reservation.persisted?
redirect_to @reservation
else
redirect_to :somewhere_else
end

这会创建一个悲观的保存,并且仅在“验证”成功时才提交写入。这消除了正在运行的验证和正在执行的实际插入之间潜在的竞争条件。

关于ruby-on-rails - 如何处理 Rails 中复杂的自定义验证的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613652/

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