2009년 4월 5일 일요일

InnoDB 2

○ FLUSH TABLES WITH READ LOCK

모든 테이블에 READ lock을 건다. 
UNLOCK TABLES를 실행하면 lock이 해제된다.

MySQL은 이 명령이 실행되었을 때  모든 테이블을  닫는다. 

모든 테이블에 공유lock을 건다. 
mysql> FLUSH TABLES WITH READ LOCK;

○ SELECT ... LOCK IN SHARE MODE
InnoDB에서만 동작한다. 
SELECT로 스킨하는 레코드에 대해서 공유lock을 건다. 

SELECT로 스킨하는 레코드에 공유lock을 걸기
mysql>SELECT * FROM t WHERE a<10>

주의점으로 위 예의 경우에는 a필드에 인덱스를 만들어 놓지 않으면 스킨된 모든 레코드에 lock을 걸게 되는 점이다.  SELECT추출조건에 사용하는 필드에는 인덱스를 만들어놓지 않으면 안된다는 것이다. 
a의 인덱스는 유일키가 아니어도 된다.

○ SELECT ... FOR UPDATE
InnoDB에서만 동작한다. 
대상이 되는 레코드에 대해서 트랜잭션이 끝날 때까지 lock을 건다. 
다른 클라이언트가 갱신을 하려고 하면 그 클라이언트는 lock의 해제를 기다려야 한다. 
5.1.12-beta현재,  lock경합시에 에러를 반환하는 구문(오라클의 SELECT NOWAIT문)은 지원되지 않는다. 
 
대상 레코드를 갱신용으로 lock을 걸기
mysql> SELECT * FROM t WHERE a<10>

SELECT ... LOCK IN SHARE MODE와 같이 a 필드에 인덱스를 만들어 놓지 않으면 조사하는 모든 레코드에 lock이 걸리므로 조심해야한다.