2009년 4월 1일 수요일

InnoDB - Lock

MyISAM에서는 테이블단위로만 lock이 되지않지만 InnoDB는 row level lock을 서포트한다. 
InnoDB가 서포트하는 row level lock은 대상이 되는 레코드만 lock을 거는 방법이다. 

row level lock을 잘 동작시키기 위해서는  최소한 InnoDB에 유일키나 프라이머리 키가 필요하다. 
InnoDB 에서 lock을 거는 방법에는 다음과 같다. 

  • InnoDB가 자동으로 건다.(갱신 쿼리인 경우 자동적으로 걸린다.)
  • 오퍼레이터가 명시적으로 건다.
            SELECT... FOR UPDATE 문                            : 배타lock
            SELECT... LOCK IN SHARE MODE문           : 공유lock
            LOCK TABLES문
            FLUSH TABLES WITH READ LOCK문

한편, MyISAM에서는 다음과 같이 lock을 건다.

  • MyISAM이 자동으로 건다.(갱신 쿼리인 경우 자동적으로 걸린다.)
  • 오퍼레이터가 명시적으로 건다. 
            LOCK TABLES문
            FLUSH TABLES WITH READ LOCK문


LOCK TABLES/ UNLOCK TABLES

LOCK TABLES문은 트랜잭션에 안전하지는 않다. 
LOCK TABLES는 테이블에 READ LOCK, WRITE LOCK(배타 LOCK)을 건다.
READ에서는 자기가 lock을 건 테이블을 다른 사람은 읽는 것을 가능하지만 자기자신도 다른 사람도 변경하는 것은 불가능하다. 
WRITE에서는 자기자신만이 lock을 건 테이블을 변경가능하다. 
다른 사람은 읽는 것도, 변경하는 것도 불가능하다. 
또,  lock을 걸고 있는 중에는 lock을 건 테이블만 접근가능하다. 
LOCK TABLES을 실행중에 클라이언트가 세션을 끊거나  현재의 스레드가 LOCK TABLES을 발행하면 서버는 lock을 해제한다. 

lock을 해제할 때는 UNLOCK TABLES를 실행한다.  모든 lock이 해제된다. 

LOCK TABLES 테이블명 {READ|WRITE} [,테이블명 {READ|WRITE}]

a테이블에는 공유lock, b테이블에는 배타lock을 거는 법
mysql> LOCK TABLES a READ, b WRITE;