2011-11-16 2 views
0

나는 파싱 할 데이터가있는 테이블과 여러 레코드를 취하여 처리하고 다시 저장하는 작업자가 있습니다. 또한 플래그를 '구문 분석'으로 설정합니다.장고, innodb 및 행 수준 잠금

이제 작업자 인스턴스를 여러 개 실행하고 두 작업자가 동일한 행을 선택하여 처리하지 못하도록하고 싶습니다. 그래서 나는 그것을 어떻게 든 막아야한다.

나는 django를 사용하고 있는데, MySQL 매뉴얼에서는 행 레벨 잠금을 얻는 것이 가능하지만이 작업을 올바르게 수행 할 수있는 예제는 찾을 수 없다. 유일한 사람은 그것이 매우 느린다고 말합니다 : http://djangosnippets.org/snippets/2039/

작업자가 행을 선택한 후 지금까지 업데이트 된 타임 스탬프가 될 'until lock'이라는 다른 필드가있을 수 있습니다. 이렇게하면 잠금 시간이 단축되고 (선택 후 업데이트 됨) 다른 작업자가이 행을 선택하지 못하게됩니다.이 작업자는 '잠김'상태가 아닌지 확인하지만 선택 및 업데이트 간 잠금 문제는 여전히 존재합니다.

감사합니다. ian

+0

지금까지 가지고있는 것을 게시 할 수 있습니까? ORM을 사용하려고합니까? 아니면 SQL을 사용하고 있습니까? –

+0

나는 장고의 ORM을 배우기 위해 가능한 한 SQL에서 멀리 떨어져있다. 저는 python/django 로의 전환을 평가하는 PHP 프로그래머입니다. 물론 원시 SQL을 사용할 준비가 된 다른 방법은 없습니다. – Ian

답변

-1

자물쇠가있는 경우 두 번째 작업자는 잠금이 해제 될 때까지 기다리지 못합니다.

어쩌면 처리를 시작하기 전에 항목을 "[timestamp] [at]에서이 작업을 시작했습니다."라고 표시하고 후속 작업자가 이러한 행을 무시하도록 할 수 있습니다. 그런 다음 어떤 임계 값보다 오래된 타임 스탬프가 있지만 "완료"(작업자가 사망했거나 다른 것이 잘못되었음을 나타냄)로 표시되지 않은 크론 작업 또는 유사한 "릴리스"행을 가질 수 있습니다.

+0

이것은 정확히 4 단락이나 제 질문에서 설명한 것입니다. 하지만 처리 할 행을 선택하는 동안 두 명의 작업자가 충돌하지 않도록하려면 잠금이 필요합니다. – Ian

1

2 가지 주요 저장 방법 MySQL의 데이터는 MyISAM & InnoDB이다.

  1. 이노은 로그를 재생하여 충돌이나 다른 예기치 않은 종료에서 복구 - 각각 자신의 장점 & 단점이있다.
  2. InnoDB는 신뢰성은 낮지 만 어떤 경우에는 더 높은 성능을 보이는 모드에서 실행될 수 있습니다.
  3. InnoDB는 동시에 여러 동시 삽입을 그룹화하고 동시에 디스크에 플러시합니다.
  4. InnoDB는 매 트랜잭션마다 트랜잭션 로그를 플러시하므로 안정성이 크게 향상됩니다.
  5. InnoDB와 달리 MyISAM에는 전체 텍스트 검색 기능이 내장되어 있습니다.
  6. MyISAM은 대개 대부분의 DB 액세스가 읽히는 상황에서 InnoDB보다 빠르게 인식되기 때문에 웹 응용 프로그램에서 널리 사용됩니다.
  7. InnoDB 테이블에 데이터를 쓰거나 업데이트하는 동안 MyISAM에서 전체 테이블이 잠기는 반면 특정 행만 잠겨 있습니다.
  8. InnoDB는 완전한 트랜잭션을 지원합니다.

django 모델에 관한 한 기본적으로 myisam 테이블 생성을 지원합니다. 테이블에 행 레벨 잠금이 필요한 경우 innodb가 필요합니다. This page은 좋은 출발점이어야합니다 : 후크에 연결하여 ALTER SQL 명령을 동적으로 실행하여 테이블에 대한 엔진을 변경하는 방법을 설명합니다. (이 내용은 4 년 전에 작성된 것으로 Django의 최신 버전으로 업데이트해야 할 수도 있습니다).

각 테이블에 사용할 저장소 엔진을 지정하는 메타 데이터를 모델에 추가하는 것이 간단해야합니다. 그런 다음 위의 예를 수정하여 해당 메타 데이터를 키 오프 할 수 있습니다.

+0

이미 InnoDB를 사용하고 있습니다 (데이터베이스 설정에서 setting.py에 'OPTIONS': { 'init_command': 'storage_engine = INNODB;'를 추가했습니다), 문제는 잠금을 얻는 방법이지 innodb를 사용하는 방법이 아닙니다 :) – Ian