使用find_or_create_by时解决竞争条件

时间:2015-06-18 06:36:11

标签: postgresql ruby-on-rails-4 activerecord race-condition

我正在使用

@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

但它不起作用。

有没有更好的方法来应对这种竞争条件?

1 个答案:

答案 0 :(得分:1)