gpt4 book ai didi

mysql - 避免由于竞争条件导致的超额预订

转载 作者:行者123 更新时间:2023-11-30 23:44:38 25 4
gpt4 key购买 nike

我们正在考虑一个预订系统,其中涉及两个模型:StoreReservationStoremax_seatsReservationguests_count 列。

为避免超额预订,我们实现了验证。在超额预订的情况下,交易将回滚。但我不确定这是否足以应对竞争条件。

像这样:

class Store < ActiveRecord::Base
has_many :reservations
validates :max_seats, presence: true, numericality: true
end

class Reservation < ActiveRecord::Base
belongs_to :store
validates :guests_count, presence: true, numericality: true

after_create do
total_seats_taken = reservation_slot.reservations.sum(&:guests_count)
unless total_seats_taken <= store.max_seats
raise ActiveRecord::Rollback
end
end
end

我怀疑这种场景仍然会发生,尽管这种情况很少见:

假设客户A和客户B分别同时预订6个座位,max_seats设置为10。如果客户A的交易先于客户B提交执行 after_create 回调,引发 ActiveRecord::Rollback 异常并且不会创建客户 B 的记录,这是预期的。但是,如果after_create回调在Customer A的交易提交之前执行,我认为会导致超额预订的情况。

A开始事务->A执行after_create->A提交事务->B执行after_create:B遇到ActiveRecord::Rollback异常

A 开始事务 -> A 执行after_create -> B 执行after_create -> A 提交事务:Overbooking!!

如果您能分享任何见解,我将不胜感激。谢谢。

最佳答案

为什么不直接使用 before_create 呢?您可以按照自己的方式进行,但为什么要开始将其写入数据库的过程并在不需要时引发异常?

关于mysql - 避免由于竞争条件导致的超额预订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46290478/

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