2013-06-11 13 views
5

다음 쿼리가 MySQL 5.1의 INNODB 테이블에서 실행되면 나에게 불분명합니다 (각각의 행에 대해 WRITE LOCK을 작성합니다) 내부적으로 업데이트 (총 5000 개) 또는 배치의 모든 행을 잠급니다. 데이터베이스의로드가 너무 많으므로이 작업이 매우 중요합니다.SELECT를 사용하여 UPDATE를 실행하면 각 행이나 모든 SELECTED 레코드가 잠길 것입니다

UPDATE `records` 
INNER JOIN (
    SELECT id, name FROM related LIMIT 0, 5000 
) AS `j` ON `j`.`id` = `records`.`id` 
SET `name` = `j`.`name` 

나는 확실히 그렇게되어 있는지 확인하는 방법을 모르는대로 행 당 수 있지만,하는 기대, 나는 깊은 지식을 가진 사람을 요구하기로 결정했다. 이 경우가 아니며 db가 집합의 모든 행을 잠그는 경우 왜 설명하는지 알려 주시면 감사하겠습니다.

+0

트랜잭션을 사용하고 있습니까? (자동 커밋 = 꺼짐)? 추신 : 귀하의 검색어가 의미 론적으로 정확한지 확신합니까? – Sebas

+0

아마 모든 행을 잠글 것이고, 그 이유는 MySQL이 롤오버이기 때문입니다. – GolezTrol

+0

오, 그건 테이블 유형에 따라 다릅니다. http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html – GolezTrol

답변

3

UPDATE은 트랜잭션에서 실행 중입니다. 이는 atomic 작업입니다. 즉, 행 중 하나가 실패하면 (예 : 고유 한 제한 조건으로 인해) 5000 개의 행이 업데이트되지 않습니다. 이것은 트랜잭션 데이터베이스의 ACID 속성 중 하나입니다.

UPDATE은 전체 트랜잭션의 모든 행을 잠급니다. 그렇지 않으면 다른 트랜잭션이 행의 값을 현재 값에 따라 추가로 업데이트 할 수 있습니다 (update record set value = value * '2'). 이 명령문은 첫 번째 트랜잭션이 커밋되거나 롤백되는 경우에 따라 다른 결과를 생성해야합니다. 이 때문에 첫 번째 트랜잭션이 모두 5000 개의 업데이트를 완료 할 때까지 기다려야합니다.

잠금을 해제하려면 업데이트를 (더 작은) 배치로 수행하기 만하면됩니다.

P. autocommit은 각 명령문이 자체 트랜잭션에서 발행되었지만 단일 조회의 실행에 영향을 미치지 않는지 제어합니다.