2012-10-24 4 views
3

나는 mysql 설명서를 읽었지만 아마도 모든 것을 이해하지 못한다. 내가 뭘 찾고 행 잠금 다른 세션에 대한 읽기. 행이 잠긴 동안 다른 세션이 잠길 때까지 기다려야합니다. 다른 세션이 스냅 샷에서 읽는 것을 원하지 않습니다! 그들이 출시 될 때까지 기다려야합니다! 내가 좀하고 싶습니다 무엇읽기에서 Mysql InnoDB 행 잠금

다음 예제로 대신 전체 테이블 잠금의 단일 행에 대해 정확히 동일합니다

START TRANSACTION 
LOCK TABLES table1 WRITE 
SELECT * FROM table1 WHERE id = 40912 
UPDATE table1 SET column1 = 'value1' WHERE id = 40912 
UNLOCK TABLES 
COMMIT 

사전에 감사합니다!

답변

1

아직 시도하지는 않았지만 MySQL 함수 GET_LOCK (str, timeout) 및 RELEASE_LOCK (str)을 사용하여 가능합니다. 여기서 "str"은 자물쇠를 식별하는 문자열입니다.

mysql_query('DO GET_LOCK("table1.40912", 60)') 
mysql_query('SELECT * FROM table1 WHERE id = 40912') 
mysql_query('UPDATE table1 SET column1 = 'value1' WHERE id = 40912') 
mysql_query('DO RELEASE_LOCK("table1.40912")') 
+0

안녕! 답변을 주셔서 감사합니다하지만 그것은 작동하지 않는 것 같습니다 ... 다른 세션 (선택) 여전히 스냅 샷에서 값을 반환합니다! –

+0

엘레나, 고맙습니다! –

1

나는이 흥미로운 문제에 대한이 가장 좋은 아이디어는 (스냅 샷이 일관성있는 경우에도 스냅 샷을 읽을 수 없습니다 MySQL의 강제하는 방법)과 같이 "선택, 모든"업데이트 "를 사용을 읽는 것 UPDATE # select-clause # ".

그러나 매우 좁은 인덱스를 사용하여 레코드를 찾는 것이 매우 중요합니다. 즉, 레코드를 잠그는 의미입니다. SELECT를 전체 테이블 스캔 또는 심지어 USING WHERE (EXPLAIN 문에서)로 실행하는 것이 좋지 않을 경우 테이블의 넓은 영역을 잠글 때 긴 시간이 소요될 수있어 잠재적으로 긴 반응 시간을 초래할 수 있습니다.

데이터베이스 추상화 계층에서 테스트 해 보시기 바랍니다.

이 메커니즘에 대한 모든 내용은 isolation documentation에서 읽을 수 있습니다.

3

엘레나 샤로 바 (Elena Sharovar)의 대답은이를 수행하는 방법이지만 필요한 사항을 완전히 설명하지는 못합니다. SELECT를 수행 할 모든 프로세스는 동일한 문자열로 GET_LOCK을 사용해야합니다. 그렇게하면 (자), MySQL는 자동적으로 (지정된 초까지) 기다려, 다른 thread가 락을 해제 할 때까지 결과를 돌려줍니다.

다음은 위에서 아래로 진행 시간, 무슨 일이야 :

  THREAD 1         THREAD 2 
DO GET_LOCK("table1.40912", 30) 
SELECT * FROM table1 WHERE id=40912  DO GET_LOCK("table1.40912", 30) 
[UPDATE query]       [automatically waits] 
[UPDATE query]       [automatically waits] 
DO RELEASE_LOCK("table1.40912")   [lock finally obtained, query terminates] 
             SELECT * FROM table1 WHERE id=40912