이것은 매우 간단합니다. 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 개의 코어에 걸쳐 실행 이러한 작업은 여러 위젯은 검사의 모두에도 불구하고 생성하는 원인이 정확히 같은 시간에 실행. 중복되지 않도록 위젯을 만들 때 경합 조건을 어떻게 막을 수 있습니까?
데이터베이스 인덱스는 중복 레코드가 생성되는 문제를 해결하지만, 코드는 여전히 삽입을 방지 할 수 있습니다 동시에 만 데이터베이스에서 실행되기 때문에 그들은 오류를 발생합니다. 데이터베이스 수준이 아닌 응용 프로그램 수준에서 솔루션을 원합니다. ActiveRecord 거래일까요? – sandre89