2011-07-31 2 views
3

나는 트랜잭션이 MySQL을 (이노)의 원자 것을 읽었습니다하지만 5 개 스레드에서 다음 코드를 테스트 할 때 그들은 같은 ID 선택 :MySQL 트랜잭션은 원자 적입니까?

$db->beginTransaction(); 

$row = $db->fetchRow("SELECT * FROM atomic WHERE selected = 0 LIMIT 1"); 

sleep(5); 

$db->update("atomic", array('selected' => 1), "id = " . $row['id']); 

$db->commit(); 

echo "Selected row: " . $row['id']; 
+1

나는 원자 성이 아니라 테이블 잠금에 대해 질문하고 있다고 생각합니다. –

+0

맞아요, 고마워요. (Gracias) – Wiliam

+0

모든 스레드에서 변수 $ row는 이전 스레드 커밋이 실행되기 전에 할당됩니다. –

답변

5

당신은이 시나리오에서 FOR UPDATE 키워드를 살펴해야합니다.

간단한 선택은 선택한 행을 잠그지 않으므로 예제에 표시되는 내용은 완전히 정상입니다.

+0

예상대로 작동했습니다. 감사합니다. :) – Wiliam