Я используюРешения гоночного Состояния При использовании find_or_create_by
@current_device ||= Device.find_or_create_by!(udid: request.headers["udid"])
, а иногда и есть состояние гонки, где из-за сетевое поведение, 2 запросов приходят одновременно, что приводит к 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
Но это не работает.
Есть ли лучший способ справиться с этим состоянием гонки?
блокировки таблицы первой. См. Http://stackoverflow.com/q/17267417/398670 –
Никогда не зависеть от проверки ActiveRecord, чтобы обеспечить уникальность, добавить уникальное ограничение внутри базы данных и обработать исключение в Ruby. –
@muistooshort, но разве это не повлечет за собой состояние гонки? –