2012-10-18 3 views
1

필자가 작성한 일련의 샐러리 작업이 있습니다. 이 작업들 각각은 - 단지 예제 - 저자 ID를 매개 변수로 사용하고 저자의 각 책에 대해 최신 가격을 가져 와서 데이터베이스에 저장합니다.Django 응용 프로그램의 셀러리 작업에서 트랜잭션을 사용하면 문제가 발생합니까?

내 작업에 Django의 @transaction.commit_on_success 데코레이터를 추가하여 트랜잭션을 트랜잭션에 추가하고 싶습니다. 모든 작업이 충돌하면 전체 작업이 실패하고 데이터베이스에 저장할 것이 아무것도 없습니다.

저자에게 책의 가격을 확인하는 십여 명의 샐러리 노동자가 있습니다.이 단순한 트랜잭션 논리가 내 Postgres 데이터베이스에서 잠금 및 경쟁 조건을 일으키는 지 궁금합니다.

나는이 프로젝트를 찾아서 django-celery-transactions이라고 불렀지 만,이 프로젝트의 진짜 문제와이 프로젝트가 해결하려고 시도한 것을 아직도 이해하지 못했습니다.

답변

1

Django 뷰에서 데코레이터를 적용하면 뷰가 종료 될 때까지 DB 트랜잭션이 커밋되지 않습니다. 뷰가 반환되어 커밋을 트리거하기 전에 DB 트랜잭션이 이미 커밋 된 것으로 예상되는 작업을 호출 할 수 있습니다. 즉, 해당 항목이 DB 컨텍스트에 존재해야합니다.

이 경쟁 조건 (보기 전에 시작하여 결과적으로 트랜잭션 완료)을 방지하기 위해 수동으로 관리하거나 언급 한 모듈을 사용하여 자동으로 처리 할 수 ​​있습니다.

예를 들어 실패 할 수있는 예는 새로운 작성자를 추가하고 모든 책의 가격을 가져 오는 작업을하는 경우입니다. 새 작성자 트랜잭션에 대한 커밋이 완료되기 전에 태스크가 실행되면 태스크는 아직 존재하지 않는 ID로 작성자를 페치하려고 시도합니다.

1

데이터베이스의 트랜잭션 격리 수준, 가격 업데이트 확인 빈도 및 가격 변경 예상 빈도 등 여러 가지 사항에 따라 다릅니다. 예를 들어, 초당 매우 많은 수의 업데이트를 stock standard PostgreSQL으로 만들면 동일한 select 문을 트랜잭션에서 여러 번 실행하는 결과가 달라질 수 있습니다.

데이터베이스가 동시성을 처리하도록 최적화되어 있으므로 이것이 문제가 될 것이라고 생각하지 않습니다. 특히 가격을 가져올 때까지 (예 : 작업 꾸미기가 아닌 컨텍스트 관리자 사용) 거래를 열지 않는 경우. 어떤 이유로 든 미래가 느려지면 최적화 (가격을 자주 가져 오거나 데이터베이스 구성을 조정하는 등)하십시오.

다른 질문은 : django-celery-transactions는 Django와 Celery 사이의 경쟁 조건을 방지하는 것을 목표로합니다. 한 예는 새로 작성된 오브젝트의 기본 키를 태스크에 전달하는 경우입니다. 태스크는보기의 트랜잭션이 커미트되기 전에 오브젝트를 검색하려고 시도 할 수 있습니다. 팔!