2011-02-11 1 views
2

나는의 테이블 내가 데몬 여러 인스턴스 (아마존 EC2)를 요구 한 상태 ('toprocess', '처리', '완료')행 잠금

에 "할 명령"이 "명령 할".

데몬은 상태 'toprocess'와 행 요청을 처리 한 다음, 각 루프의 끝에서 그 '일'로 상태를 변경한다.

것은 그 루프를 시작하기 전에, 나는 상태 '처리'모든 행 'toprocess'을 변경해야한다는 것입니다, 그래서 다른 경우 충돌을 피하고, 같은 행이 적용되지 않습니다.

내가 InnoDB의 행 잠금에 대해 읽었습니다,하지만 난 아주 잘 그들을 이해하지 못하는 ...

SELECT * 상태 = 'toprocess' 다음 나는이 결과의 ID 년대를 취할 필요가 명령의 , 상태를 'processing'으로 갱신하여 갱신 될 때까지이 행을 잠급니다.

어떻게 할 수 있습니까? 난 당신이 (내장 된 방법을 사용하여) 행을 잠글 MySQL을 사용할 수 없습니다 알고

은 지금까지 당신에게

답변

0

감사드립니다. 당신은 두 가지 옵션이 있지만 : 잠금이 다음 당신은 당신의 자신의 기본 행 잠금을 구현할 수 as described here

  • 잠금 테이블 수준을 사용할 수 있습니다 해제 될 때까지 테이블이 다른 프로세스에서 읽을 수 안된다 경우

    1. 처리중인 각 행의 값을 업데이트 한 다음 모든 다른 데몬에서이 등록 정보가 설정되어 있는지 (BIT 데이터 유형으로 충분할 것인지) 확인하십시오. 당신이 임의의 기간 동안 행을 잠 그려면 어쨌든 읽고 업데이트에 대한 행 수준에서

    InnoDB의 잠금 장치,하지만 당신은 두 번째 옵션으로 이동 할 수 있습니다.

    각 데몬 고유 ID가되며, 테이블이 '오너라는 새로운 항목을 갖

  • +0

    안녕하세요, ... 테이블 잠금이 너무 많아서 (응용 프로그램의 나머지 부분에서 생각 중입니다 ...) 두 번째 옵션은 해결책을 제시합니다 ... 어떻게 할 수 있습니까? – FlamingMoe

    +0

    테이블을 변경하고 'locked'라는 BIT (1) 데이터 유형을 추가하고 '처리 중'으로 표시 한 모든 행에서 1로 설정해야합니다. 각 행의 처리가 끝나면 'locked'속성을 0으로 재설정하십시오. 테이블에서 임의의 행을 선택할 때는 쿼리 절에 "WHERE locked = 0"을 추가하십시오. 이렇게하면 모든 프로세스가 두 번 실행되지 않습니다. – JamesHalsall

    +0

    우리는 같은 문제를 발견 할 것입니다 ... 그 동안 필드를 1로 업데이트하면 다른 인스턴스가 읽을 수 있습니다 ... 그래서 행 고정 솔루션이 필요하지만 구현 방법을 모르겠습니다. – FlamingMoe

    1

    가능한 (아직 매우 우아 생략) 용액 제 업데이트 할 수있다 기록 후 데이터를 판독 그 신분증에. 그러면 deamon은 "UPDATE table SET status = 'processing', owner = 'theDeamonId'와 같이 status = 'toprocess'... LIMIT 1"

    업데이트가 실행되는 동안 행이 잠겨 있으므로 다른 deamon이 그것을 읽을 수 있습니다. 이 행을 업데이트 한 후 특정 행선지에서 필요한 모든 데이터를 가져 오기 위해 SELECT를 실행합니다 (WHERE status = 'processing'AND owner = 'theDeamonId').

    마지막으로, 마지막 업데이트 "처리"행하도록 설정되며 (또는되지 않을 수 있음) 소유자 필드를 제거 할 수있다. 그것을 유지하면 데몬의 작업에 대한 통계도 얻을 수 있습니다.

    3

    당신은 트랜잭션을 사용하고

    begin transaction; 
    select * from commands where status = 'toprocess' for update; 
    for each row in the result: 
        add the data to an array/list for processing later. 
        update commands set status='processing' where id = row.id; 
    
    commit; 
    
    process all the data 
    

    FOR UPDATE에 대해 조금 읽기 선택됩니다 행에 대한 업데이트를 포함하는 다른 선택을 차단합니다 UPDATE에 대한로 데이터를 읽고, 줄 InnoDB isolation levels.