2015-06-18 1 views
2

Я используюРешения гоночного Состояния При использовании 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 

Но это не работает.

Есть ли лучший способ справиться с этим состоянием гонки?

+1

блокировки таблицы первой. См. Http://stackoverflow.com/q/17267417/398670 –

+0

Никогда не зависеть от проверки ActiveRecord, чтобы обеспечить уникальность, добавить уникальное ограничение внутри базы данных и обработать исключение в Ruby. –

+0

@muistooshort, но разве это не повлечет за собой состояние гонки? –

ответ