2010-07-21 1 views
1

내 응용 프로그램의 한 부분에서 여러 스레드가 동일한 영구 객체를 만들 수있는 경쟁 조건이 있습니다. 그래서 다음과 같습니다 코드 구현 :Django ORM + MySQL/InnoDB와 경쟁 조건을 잡아내는 올바른 방법

from foobar.models import Bar 

def testomatic(request): 
    bar = None 
    tries = 0 
    while not bar: 
     try: 
      bar = Bar.objects.get(b=2) 

     except Bar.DoesNotExist: 
      time.sleep(10) # put in here to force the race condition 
      bar = Bar(a = 2, b = 2) 
      try: 
       bar.save() 
      except IntegrityError: 
       tries += 1 
       bar = None 

      if tries > 1: 
       raise Exception("something bad happened") 

    return HttpResponse("tries = %s" % tries) 

그리고 이것은 내 테스트 환경에서 작동 확인을 -하지만 난 "진짜"클래스와 함께이 프로그램을 실행할 때, 반복 (가져 오기에서 아무것도 점점없고, 회전 보인다)하지만 항상 save()에서 IntegrityError를 얻습니다.

데이터베이스 엔진으로 MySQL/InnoDB를 사용하고 있습니다. 레코드를 얻지 못하게하는 MVCC 처리에 대한 것이 있습니까?하지만이를 만들려고 할 때 중복 키 오류가 발생합니다.

+0

이 형식은 http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django의 복제본이며 답변은 거기에 있습니다. –

답변

0

이 작업을 수행하는 올바른 방법은 원시 SQL에 놓아서 초기 SELECT를 수행 할 때 테이블을 잠그고 개체가없는 경우 해당 개체를 만들고 저장 한 다음 테이블을 잠금 해제하는 것입니다.