2012-11-04 2 views
0

MySQL에서 테이블을 잠그는 데 문제가 있습니다. 서로 다른 브라우저에서 동시에 두 개의 스크립트를 실행하여 동시 요청 테스트를 시도했습니다.테이블 잠금 실패

스크립트 1 :

mysql_query("lock tables id_numbers write"); 

$sql = "select number from id_numbers"; 
$result = mysql_query($sql); 

if ($record = mysql_fetch_array($result)) 
{ 
    $id = $record['number']; 
} 

sleep(30); 

$id++; 

$sql = "update id_numbers set number = '$id'"; 
$result = mysql_query($sql); 

mysql_query("unlock tables"); 

스크립트 2 :

$sql = "select number from id_numbers"; 
$result = mysql_query($sql); 

if ($record = mysql_fetch_array($result)) 
{ 
    $id = $record['number']; 
} 

echo $id; 

처음 스크립트 1 시작, 다음 스크립트 1 테이블 잠금을 해제 할 때까지 이론적으로, 스크립트 (2) 30 + 초를 기다려야 스크립트 2. 시작 업데이트 된 ID를 출력 할 수 있습니다. 그러나 즉시 원래 ID를 출력하므로 잠금이 적용되지 않습니다. 무엇이 잘못 될 수 있습니까?

아직, 나는 아직도 mysql_ *을 사용해서는 안된다는 것을 알고 있지만, 지금 당장 붙어있다.

편집 : 자물쇠가 라이브 사이트에서 발생하지만 내 개발 사이트에서는 발생하지 않음을 발견했습니다. 그들은 둘 다 공유 호스트에 있으므로 두 설정 간에는 다른 설정이 있다고 가정합니다. 그게 뭔데?

+1

자물쇠가있는 글씨. 독서가 아닙니다. –

+0

@ 대진 예, 읽고 쓰기를 원합니다. MySQL 매뉴얼에 따르면, "쓰기 잠금 : 잠금을 보유한 세션은 테이블을 읽고 쓸 수 있으며 잠금을 보유한 세션 만 테이블에 액세스 할 수 있습니다. 잠금이 해제 될 때까지 다른 세션에서 액세스 할 수 없습니다. WRITE 잠금이 유지되는 동안 다른 세션 블록에 의한 테이블. " 그게 내가 원하는거야. – gr8dane

답변

1

여기에있는 코드를 사용하면 스크립트 2가 unlock tables을 발행 할 때까지 스크립트 2가 차단됩니다.

문제는 다른 곳에 위치해야합니다. 확인할 사항 :

  1. 실제로 데이터베이스에 테이블이 있습니까? (당신이 어떤 FALSE 수익을 얻을 경우 mysql_query() 반환 값을 확인하고 mysql_error()를 사용합니다.)
  2. 같은 데이터베이스에 연결하는 두 스크립트 있습니까?
  3. 테이블이 임시 (따라서 연결 로컬) 테이블이 아닌 것이 확실합니까?
  4. 스크립트 1의 mysql 연결 (또는 스크립트 자체)이 sleep(30) 동안 시간 초과되어 예상보다 빨리 잠금을 해제 할 수 있습니까?
+0

죄송합니다. 나는이 질문을 쓸 때 실수를했다. 실제 스크립트는 id_numbers를 잠급니다. – gr8dane

+0

오랜 시간이되어 죄송합니다. 나는 당신의 대답이 바뀌 었다는 것을 깨닫지 못했습니다. 예, 1, 2 & 3. # 4 : 수면 길이를 바꾸어도 아무런 차이가 없습니다. 내 원래 질문에 대한 편집을 참조하십시오. – gr8dane

+0

DB 사용자에게 테이블을 잠글 수있는 권한이 있습니까? –