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;