2013-09-02 1 views
2

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html에 따르면, mysql에서 쓰기위한 테이블을 잠그면 다른 누구도 잠금이 해제 될 때까지 액세스 할 수 없습니다. 내가로드,이 스크립트를 작성하거나이 script.php 또는이 script.php 리터 당신이 원하는 무슨에 따라 = 1과 :?LOCK TABLES [table] WRITE가 테이블 읽기를 방지하지 않는 이유는 무엇입니까?

if ($_GET['l']) 
{ 
    mysqli_query("LOCK TABLES mytable WRITE"); 
    sleep(10); 
    mysqli_query("UNLOCK TABLES"); 
} 
else 
{ 
    $res=mysqli_query("SELECT * FROM mytable"); 
    // Print Result 
} 

을 그때 하나 개의 브라우저 창에서이 script.php L = 1을로드하는 경우, 잠자는 동안 다른 창에서 script.php를로드 할 수 있어야하며 script.php? l = 1이 완료 될 때까지 기다려야합니다. 맞습니까?

것은 L = 1은 쓰기 잠금이있는 경우에도이 script.php? 바로,이 script.php로드입니다. script.php에 삽입하려고하면 기다리지 만 왜 SELECT가 허용됩니까?

참고 : 내가 LOCK 테이블을 사용할지 여부에 대한 논의를 찾고 있지 않다. 사실 나는 아마도 거래를 할 것입니다. 지금 조사 중입니다. 지금 당장은 왜 위의 방식이 효과가 없는지 이해하고 싶습니다.

+0

이 당신의 PHP 공유 MySQL의 연결을 사용하도록 설정 될 수 있습니다 :

은 선택에 "SQL_NO_CACHE"키워드를 추가하여 방지 할 수 있습니다? – Barmar

+0

확인 하겠지만, 그렇다면 왜 INSERT 지연이 발생하지만 SELECT는 그렇지 않습니까? –

+0

방금 ​​mysql> 명령 프롬프트에서 시도해 보았습니다. 예상대로 잠금이 작동했습니다. – Barmar

답변

0

LOCK의 요점은 당신이 당신의 특정 세션을 사용하는 동안 다른 세션 테이블을 수정하지 않는 것이 그렇다.

SELECT 쿼리를 수행 할 수있는 이유는 새 창을 열어도 여전히 동일한 MySQL 세션의 일부로 간주되기 때문입니다.

+0

MySQL에 따르면 WRITE 잠금은 테이블에 대한 모든 액세스를 금지합니다. 그렇지 않으면 READ와 WRITE 잠금의 차이점은 무엇입니까? 동일한 MySQL 세션에 대해서는 두 가지 이유로 이것이 사실이라고 생각하지 않습니다. 1 : INSERT가 차단되었고 2 : 다른 브라우저 창 대신 다른 컴퓨터/IP에서 수행 할 수 있으며 여전히 발생합니다. –

+0

http://dev.mysql.com/doc/refman/5.0/en/lock- tables.html : "잠금을 유지하는 세션은 테이블을 읽고 쓸 수 있습니다." –

+0

읽기 잠금의 경우 : "잠금을 보유한 세션은 테이블을 읽을 수 있지만 기록 할 수는 없습니다." –

2

이는 쿼리 캐싱으로 인해 발생합니다. 잠금 결과에 영향을주지 않는 캐시 결과가 있으므로 결과가 반환됩니다.

SELECT SQL_NO_CACHE * FROM mytable 
+0

감사합니다. 너는 내 시간을 절약한다. –

관련 문제