我有这个指标在我的模型的表:Rails的:ActiveRecord的:RecordNotUnique与first_or_create
UNIQUE KEY `index_panel_user_offer_visits_on_offer_id_and_panel_user_id` (`offer_id`,`panel_user_id`)
而这种代码:
def get_offer_visit(offer_id, panel_user_id)
PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first_or_create!
end
随机引起我们的应用程序一个ActiveRecord :: RecordNotUnique例外, 的问题是:
关键 “index_panel_us重复条目er_offer_visits_on_offer_id_and_panel_user_id”
我读过的轨道文件,让first_or_create!
不是一个原子的方法,并可能导致这种问题在高并发环境和解决方案将只是捕捉异常,然后重试。
我尝试了不同的方法,包括Retriable gem重试一定次数来重复操作,但仍然引发RecordNotUnique。
我甚至试图改变的逻辑:
def get_offer_visit(offer_id, panel_user_id)
begin
offer_visit = PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first_or_initialize
offer_visit.save!
offer_visit
rescue ActiveRecord::RecordNotUnique
offer_visit = PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first
raise Exception.new("offer_visit not found") if offer_visit.nil?
offer_visit
end
end
但代码仍然提高我所做的自定义异常,我真不明白它是如何失败的第一次尝试,因为创建记录记录存在,但当它试图找到记录时,它不会再找到它。
我错过了什么?