2014-06-11 1 views
0

꽤 오랜 시간이 지나면 입력 데이터를 저장할 스레드에서 작업을 실행하고 있습니다. Django는 일반적으로 그 동안 변경 될 수있는 전체 객체를 저장합니다. 또한 트랜잭션이 실패하거나 다른 작업을 차단하기 때문에 트랜잭션을 실행하고 싶지 않습니다. 내 솔루션은 데이터를 다시로드하고 결과를 저장하는 것입니다. 이것은 갈 길입니까 아니면 낙관적 인 잠금 체계, 부분적으로 저장해야합니까 아니면 내가 사용해야 할 다른 것이 있습니까?Django 장기 실행 작업 - 데이터베이스 일관성

내 솔루션 : 당신이 긴 작업을하고 다른 작업을 차단하지 않으려면

with transaction.atomic(): 
    obj = mod.TheModel.objects.get(id=the_id) 

# Work the task 

with transaction.atomic(): 
    obj = mod.TheObject.objects.get(id=obj.id) 
    obj.result = result 
    obj.save() 

답변

0

는 일반적으로, 이러한 작업은 비동기되고 싶어요.

Django에서 이러한 종류의 작업을 수행 할 라이브러리가 있습니다. 가장 유명한 것은 아마도 http://www.celeryproject.org/

+0

좋은 프로젝트. 트랜잭션/낙관적 인 잠금 또는 부분 저장에 도움이되는 셀러리의 기능은 표시되지 않습니다. 트랜잭션을 실행하거나 다시로드 할 필요가 있습니다. 내가 놓친 게 있니? – Ganwell

0

입니다. Django QuerySet's update method을 통해 부분 저장을 사용하는 것이 좋습니다. save method on instances에는 update_fields 키워드 인수가있어 저장하려는 필드가 제한됩니다. 그러나 save 메소드 자체의 모든 논리는 다른 데이터를 최신으로 유지하는 데 의존 할 수 있습니다. 그 목적으로 비교적 새로운 instance update_from_db method이 있습니다. 그러나 저장 메소드가 대체되지 않으면 둘 다 어쨌든 정확히 동일한 SQL을 생성합니다. update을 사용하면 데이터 무결성과 관련된 잠재적 문제를 피할 수 있습니다.

예 :

num_changed = mod.TheObject.objects.filter(id=obj.id).update(result=result) 
if num_changed == 0: 
    # Handle as you would have handled DoesNotExist from your get call