2012-07-14 5 views
3

이것은 매우 간단합니다. Cogs를 찾는 크롤러를 실행하고 있습니다. 톱니는 하나의 위젯에 속할 수 있습니다. 때로는 동일한 도구에 속해야하는 여러 개의 톱니 바퀴를 찾습니다. 톱니 바퀴 모델에서 그것을 실행 :DelayedJob breaking은 ActiveRecord의 고유 한 제약 조건을 확인합니다.

- CREATE Cog, name: "cog1", (Widget, name: "Foo") 
- CREATE Cog, name: "cog2", (Widget, name: "Foo") 
- CREATE Cog, name: "cog3", (Widget, name: "Foo") 
- CREATE Cog, name: "cog4", (Widget, name: "Foo") 

이 불가피하지만 위의 일치 코드에 의해 처리 될 것이라고 생각 :

# Find or create widget 
match = Widget.where("name ILIKE (?)", name).first 
match = Widget.create(name: name) unless match 

병렬 모든 실행 지연된 작업은 다음과 같이 본질적으로. 또한 위젯 모델이 있습니다

validates :name, presence: true, uniqueness: true 

불행하게도, 4 명 DelayedJob 근로자는 4 개의 코어에 걸쳐 실행 이러한 작업은 여러 위젯은 검사의 모두에도 불구하고 생성하는 원인이 정확히 같은 시간에 실행. 중복되지 않도록 위젯을 만들 때 경합 조건을 어떻게 막을 수 있습니까?

답변

1

고유 확인과 삽입이 별도로 수행되기 때문에 경쟁 조건이 있습니다. 고유성 제약 조건을 적용하려면 인덱스가 필요합니다.

워드 프로세서이 언급 : http://guides.rubyonrails.org/active_record_validations.html#uniqueness

+0

데이터베이스 인덱스는 중복 레코드가 생성되는 문제를 해결하지만, 코드는 여전히 삽입을 방지 할 수 있습니다 동시에 만 데이터베이스에서 실행되기 때문에 그들은 오류를 발생합니다. 데이터베이스 수준이 아닌 응용 프로그램 수준에서 솔루션을 원합니다. ActiveRecord 거래일까요? – sandre89

관련 문제