2012-08-21 3 views
0

두 개의 외부 스크립트를 사용하는 django 앱이 있습니다. 하나의 스크립트는 파일을 A에서 B로 옮기고 B에 대한 값을 데이터베이스에 저장하며 이후에는 존재하는 모든 트랜잭션을 커밋해야합니다. 다음 스크립트는 inotify를 사용하여 파일의 움직임에 반응하고 md5sum을 계산하며 (시간이 오래 걸림) x = Queue.get(filename=location)과 같은 데이터베이스 항목을 찾습니다. 내 로그의 타임 스탬프를 보면 두 번째 스크립트 (실제로 데몬)가 쿼리를 실행하기 전에 첫 번째 스크립트가 오래되었다는 것을 100 % 확신합니다. 흥미롭게도,이 것은 데몬을 재시작 한 후에 완벽하게 작동합니다.django에서 DB 쿼리 캐싱

이것은 내가 어떻게 든 새로운 파일이 inotify로 감지 될 때마다 위에 표시된 코드를 실제로 실행하는 Queryset이 ​​데몬의 런타임 중에 캐시됩니다. 그러나 나는 항상 데몬을 재시작하고 싶지는 않지만 실제로 캐시 대신 DB를 실제로 사용하도록 쿼리를 강제합니다.

는 장고 내용은 해당에 대해 많은 말을하지 않습니다 - 그러나 일반적으로

어떤 힌트 사전에 감사 외부 :)로 사용되지 않습니다 장고!

PS : 데몬

def _get_info(self, path): 
    try: 
     obj = Queue.objects.get(filename=path) 
     x = obj.x 
     return x 
    except Exception, e: 
     self.logger.error("Error in lookup: %s" % e) 
     return None 

이을의 관련 부분의 소스가 스레드에 의해 호출 요청에 따라 매번 새 파일이 감시 디렉토리

로 이동 첫 번째 스크립트의 코드는 다음과 같습니다.

for f in Queue.objects.all(): 
    if (matching_stuff_here): 
     f.filename = B 
     f.save()  
     sys.exit(0) 

답변

0

어떤 실제 코드도 표시되지 않으므로 추측해야합니다. 내 생각 엔 첫 번째 스크립트의 트랜잭션이 완료되고 커밋 된 경우에도 여전히 스크립트 B의 열린 트랜잭션 내부에 있으며 트랜잭션 격리로 인해 트랜잭션을 완료 할 때까지 B에서 변경 사항을 볼 수 없습니다 그곳에.

+0

관련 소스 코드가 포함되도록 게시물을 업데이트했습니다. 그러나 모든 것을 파악하는 한, 데몬에서 각 조회 후에 트랜잭션을 강제 종료해야합니다. 맞습니까? – sqrtsben