2011-02-11 1 views
2

를 업데이트 잠금) 인스턴스를 사용하여 동일한 작업을 수행합니다.행 (또는 그 이상 내가 InnoDB의 테이블이 다른 인스턴스의 많은 (구름) 각 인스턴스에</p> <p>데몬이 테이블의 "일을"100 개 개의 행을 필요로 읽었습니다,하지만 난이 원하지 않는

"상태"열 ("할일", "수행 중", "완료 됨")이 있습니다.

인스턴스 1 : status = "todo"인 경우 100 개의 행이 필요합니다 ... 그런 다음이 행을 "수행 중"상태가되도록 업데이트해야합니다. 따라서 인스턴스 2,3은 ... x는 동일한 행을 사용할 수 없습니다 .

어떻게 할 수 있습니까?

제발, 나는 모든 테이블을 잠그지 않고도 해결책을 원하지만 행을 잠그는 것은 (innodb을 사용하기 때문에) ... 나는 그것에 대해 많이 읽었습니다. (LOCK SHARE MODE, FOR UPDATE, COMMITs ...

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

답변

0

는이 작업을 수행하기 위해 LOCK 테이블과 UNLOCK 테이블 기능을 사용해야합니다 ... 올바른 방법으로하지 않습니다. 이렇게하면 읽은 기록이 잠길 수 있습니다. 모든 데이터를 가져 오면 레코드가 "수행 중"으로 업데이트되고 COMMIT 트랜잭션이 업데이트됩니다. 아마도 누락 된 것은 트랜잭션의 사용 또는 올바른 명령 순서입니다. 다음은 기본 예제입니다.

BEGIN TRANSACTION; 
SELECT * FROM table WHERE STATUS = 'todo' FOR UPDATE; 

// Loop over results in code, save necessary data to array/list.. 

UPDATE table SET STATUS ='doing' WHERE ...; 
COMMIT; 

// process the data... 

UPDATE table SET STATUS ='done' WHERE ...; 
+0

그러면 다른 데몬이 고정됩니다. 어쩌면 DB 파일은 처리에 비해 매우 짧은 기간이 소요되지만 일정 기간 동안 모든 사람을 잠급니다. 이를 위해 행 수준의 잠금이 더 적절합니다. –

+0

예 Marc B ... 행 잠금을 찾고 있는데 어떻게해야할지 모르겠다 ... 나는 많은 설명서를 읽었지만 예제를 찾지 못했고 잘 모른다 그것을 정확히하는 방법 : ( – FlamingMoe

+0

누구든지? – FlamingMoe

0

트랜잭션을 사용하고 SELECT ... FOR UPDATE 당신이 레코드를 읽을 때 :)하지만 난