소개

MyISAM 이나 MEMORY 스토리지 엔진은 자체적인 잠금을 가지지 않고 Mysql에서 제공하는 테이블 락을 그대로 사용한다.

4.3.1 잠금획득

읽기 잠금 : 테이블에 쓰기 잠금이 걸려 있지 않으면 바로 읽기 잠금을 획득하고 읽기 작업을 시작할 수 있다. 쓰기 잠금 : 테이블에 아무런 잠금이 걸려 있지 않아야만 쓰기 잠금을 획득할 수 있고 그렇지 않으면 다름 잠금이 해제될 때까지 대기해야한다.

4.3.2 잠금튜닝

  mysql> SHOW STATUS LIKE 'Table%';
  
  +-----------------------+--------------+
  Variable_name              Value
  +-----------------------+--------------+
   Table_locks_immediate    1151552
   Table_locks_waited       15324
  +-----------------------+--------------+

  잠금 대기 쿼리 비율 : Table_locks_waited / ()Table_locks_immediate + Table_locks_waited ) * 100

이슈치가 높으면 테이블 잠금 때문에 경합이 많이 발생하고 있으므로 테이블을 분리하거나, InnoDB 스토리지 엔진으로 변환하는 방법을 고려해봐야한다. InnoDB 는 레코드 단위 잠금을 사용하기 때문에 집계에 포함되지 않는다.

4.3.3 테이블 수준의 잠금 확인 및 해제

MyISAM 이나 MEMORY 등과 같은 스토리지 엔진을 사용하는 테이블은 모두 테이블 단위의 잠금이므로 테이블을 해제하지 않으면 다른 클라이언트에서 그 테이블을 사용하는 것이 불가능하다.

어떤 클라이언트 커넷견이 잠금을 기다리고 있는지 확인하려면 "SHOW PROCESSLIST" 명령을 사용해야 한다. 클라이언트를 종료시키는 방법은 "KILL QUERY 클라이언트_Id" 명령으로 클라이언트가 실행하고 있는 쿼리만 종료시키거나 "KILL 클라이언트_ID"명령으로 클라이언트 커넥션을 종료시킬 수 있다.