Mysql 避免因比赛条件而导致的超额预订
我们正在考虑预订系统,其中涉及两种模式:Mysql 避免因比赛条件而导致的超额预订,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我们正在考虑预订系统,其中涉及两种模式:Store和reservation商店有最大座位和预订有客人计数列 为了避免超额预订,我们实施了验证。如果发生超额预订,交易将回滚。但我不确定在比赛条件下这是否足够简单 像这样: class Store < ActiveRecord::Base has_many :reservations validates :max_seats, presence: true, numericality: true end class Reservati
Store
和reservation
<代码>商店有最大座位
和预订
有客人计数
列
为了避免超额预订,我们实施了验证。如果发生超额预订,交易将回滚。但我不确定在比赛条件下这是否足够简单
像这样:
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在创建后执行:B遇到ActiveRecord::Rollback
异常
A启动事务->A在创建后执行<代码>->B在创建后执行<代码>提交事务:超售
如果您能分享任何见解,我将不胜感激。谢谢。为什么不在创建之前使用一个?您可以按自己的方式进行,但如果不需要,为什么要开始将其写入数据库并引发异常呢