2014-05-23 3 views
1

이러한 종류의 문제와 관련된 가능한 도구의 범위는 광범위하지만 Django를 사용하고 있습니다.웹 프레임 워크에서 작업자 동기화, 즉 Django

우리가 관심있는 시스템에서 우리는 2 종류의 근로자를 사용합니다. gunicorn 작업자가 django 뷰를 담당해야하는 경우 celery은 비동기 적으로 실행되어야하는 일부 루틴을 담당합니다. 두 유형의 작업자 모두 데이터베이스에서 읽고 쓸 수 있으므로 아래에서는 간단히 workers이라고합니다.

>>> from someapp.models import mymodel 

>>> foo = mymodel(field1='bar', field2='baz') 
>>> foo.save() 
>>> foo.id 
5 

>>> foo = mymodels.objects.get(id=5) 
>>> foo.field1 
'bar' 

는 사례 연구를 할 수 있습니다, 다음과 같이 같은 foo 개체를 얻을 수 있습니다, 그것은 DB에 존재 주어진 다음과 같이

하나는 데이터베이스 작업을 수행 할 수 ;

이 시스템에 운영이 명 노동자, 그리고 같은 시간에 그들은 다음

# Both processes 
foo = mymodel.objects.get(id=5) 

mymodel에서 같은 행을 읽고, 근로자 1 field1

# Worker 1 
foo.field1 = 'bird' 

'bird'에 노동자 2 변경 변경 field2 to 'dinosaur'

# Worker 2 
foo.field2 = 'dinosaur' 
이 시점에서

은 데이터베이스에 아무 것도 기록되지 않습니다.

# Worker 1 
foo.save() 

것처럼 관련 행의 변경이 발생

# Worker 2 
foo.save() 

경우이 수술 후

id | field1 | field2 
-----+---------+------ 
5 | bird | baz 

: 당신이 동의하는 것처럼

id | field1 | field2 
-----+---------+------ 
5 | bar | dinosaur 

, 이것은이다 심각한 동기화 문제. 이것을 해결하는 우아한 방법이 있습니까? 어떻게해야합니까?

한가지는이 문제는 너무 분명합니다. 그러나 인터넷에서 나는 여기에서 설명한 것을 언급하지 않았기 때문에이 문제의 타당성에 대해 의심을 품게되었습니다.

답변

1

각 근로자가 특정 필드를 업데이트하는 경우 crash843로 대답하는 것이 좋습니다. 각 노동자가 행을 잡고 싶은 가 빠른 수정하기 전에을 잠그면

, select_for_update()를 사용

entries = Entry.objects.select_for_update().filter(author=request.user) 

항목은 현재 장고 트랜잭션이 종료 될 때까지 잠 깁니다.

참조 번호 : https://docs.djangoproject.com/en/1.4/ref/models/querysets/#select-for-update

관련 문제