2014-05-14 1 views
2

몽고이에서 find_or_create_by을 사용할 때 동시성을 처리 할 방법이 있습니까?mongoid : 동시 처리 find_or_create_by

내 애플리케이션의 일부 항목에 태그를 지정하려면 Tag.find_or_create_by(name: "foo")을 사용하고 있습니다. Tag 모델에서

나는 또한 고유성 검증을 사용하고 있습니다 : 사용자가 시간의 짧은 기간에 여러 게시물 요청을 보낼 때 validates_uniqueness_of :name

그러나, 나는 내 데이터베이스에 중복 된 태그를 얻는다.

나는 왜이 문제가 발생하는지 이해한다고 생각하지만 의도 한대로 작동시키는 방법을 모릅니다. 어떤 생각?

감사합니다.

+0

질문에 실제 문제가 있음을 보여줄 수 있습니까? 지금까지 게시 한 내용은 다양한 방식으로 해석 할 수 있습니다. –

+0

여러 스레드에서'find_or_create_by'를 동시에 사용하면'validates_uniqueness_of' 속성을 사용하여 몇 번이나 레코드를 생성 할 수 있습니다. – zishe

+0

예, 끝났습니다. – aherve

답변

3

나는이 원자 수 있도록 두 가지 작업이 플립 것 : 다음 UPSERT

편집을 찾을 수없는 경우 1)) 2를 찾을 : 또는, UNIQUE 인덱스 및 캐치를 사용/던져 고유의 예외를 닫습니다.

EDIT2 :

이가 "진짜 대답은"나는 정교한 것이다 확인합니다.

이 작업을 하나의 트랜잭션으로 유지하려면 원하는 필드에 고유 인덱스 (http://docs.mongodb.org/manual/tutorial/create-a-unique-index/)를 지정할 수 있습니다. find_or_create_by를 다중 스레드 방식으로 사용하면 중복 키를 발견했을 때 발생하는 예외/오류를 캐치 및 해독 할 수있는 한 올바르게 작동합니다 (사용 언어를 조사해야 함)

또는 이것을 두 개의 트랜잭션으로 변환하십시오. 삽입 결과를 찾지 못하면 먼저 기준에 따라 찾기를 수행하십시오. 여기에 일반 삽입을 수행하면 문제가 발생하지만 upsert 작업 (upsert 옵션을 사용하여 업데이트 - http://docs.mongodb.org/manual/reference/method/db.collection.update/)을 사용하면 고유성이 보장됩니다.

+0

'upsert'에 감사드립니다. 그것에 대해 몰랐습니다. – zishe