我正在使用
@current_device ||= Device.find_or_create_by!(udid: request.headers["udid"])
有时存在竞争条件,由于网络行为,2个请求同时发生,这导致使用相同的udid创建2个设备,即使udid列上有唯一性验证。
我试图用
吞没它begin
@current_device ||= Device.find_or_create_by!(udid: request.headers["udid"])
rescue ActiveRecord::RecordInvalid => e
if e.message == 'Validation failed: Udid has already been taken'
retry #to compensate/handle possible(and very happening) race condition
else
Rollbar.error(e)
end
end
但它不起作用。
有没有更好的方法来应对这种竞争条件?
答案 0 :(得分:1)