Próbuję wymusić unikalność wartości w jednym z moich pól tabeli. Zmiana tabeli nie jest opcją. Muszę użyć ActiveRecord, aby warunkowo wstawić wiersz do tabeli, ale jestem zaniepokojony synchronizacją.Warunki wyścigu w Railsach first_or_create
Czy first_or_create
w Rails ActiveRecord zapobiega warunkom wyścigu?
Jest to kod źródłowy first_or_create
z GitHub:
def first_or_create(attributes = nil, options = {}, &block)
first || create(attributes, options, &block)
end
Czy to możliwe, że duplikat wpisu spowoduje w bazie danych ze względu na problemy z synchronizacją z wieloma procesami?
AR jest pełen takich warunków wyścigowych jak ten. – dbenhur
Zobacz (SO dup) [Jak uniknąć sytuacji wyścigowej w mojej aplikacji Rails?] (Http://stackoverflow.com/questions/3037029/how-do-i-avoid-a-race-condition-in-my -rails-app) i Rails Cookbook [Unikanie warunków wyścigu z optymistycznym blokowaniem] (http://underpop.free.fr/r/ruby-on-rails/cookbook/I_0596527314_CHP_3_SECT_19.html) – dbenhur
@dbenhur - nie mogę użyć optymistyczne blokowanie, ponieważ wymaga dodania pola do tabeli. Jednym z moich warunków było to, że nie mogę dodać pola, więc nie jest ono duplikatem. –