MySQL에서 사용되는 잠금은 스토리지 엔진 레벨MySQL 엔진 레벨로 나눠볼 수 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치게 되지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진간 상호 영향을 미치지 않는다. MySQL 엔진 레벨에서는 테이블 데이터 동기화를 위한 테이블 락 말고도 유저 락, 테이블 명에 대한 잠금을 위한 네임 락 등등을 제공한다.

4.2.1 글로벌 락

  • FLUSH TABLES WITH READ LOCK 명령(실행과 동시에 MySQL 서버에 존재하는 모든 테이블에 잠금을 건다)으로만 획득할 수 있으며, MySQL에서 제공하는 잠금 가운데 가장 범위가 크다.
  • 한 세션에서 글로벌 락을 획득하면, 다른 세션에서 SELECT를 제외한 대부분의 DDL, DML 문장 수행시 글로벌 락이 해제될 때 까지 대기 상태로 남는다.
  • MySQL 서버 전체에 영향을 미친다.
  • MyISAM 혹은 MEMORY 테이블에 대해 mysqldump로 일괄된 백업을 받아야 할 때 글로벌 락을 사용해야 한다.

4.2.2 테이블 락(TABLE LOCK)

  • 개별 테이블 단위로 설정되는 잠금이다.
  • LOCK TABLES table_name [READ | WRITE] 명령어를 통해 특정 테이블의 락을 획득할 수 있다.
  • UNLOCK TABLES를 통해 락을 반납(해제)한다.
  • 전체 어플리케이션 서버에 영향을 끼칠 수 있기 때문에 특별한 상황이 아닌 이상 사용하지 않는다.
  • 묵시적 테이블 락 : MyISAM, MEMORY 테이블에 데이터를 변경하는 쿼리 실행시 잠금을 설정하고, 데이터를 변경한 후 즉시 잠금을 해제(자동해제)된다.

4.2.3 유저 락(USER LOCK)

  • GET_LOCK() 함수를 이용해 임의로 잠금을 설정할 수 있다.
  • 유저 락은 단순히 사용자가 진정한 문자열에 대해 락을 획득하고 반납한다.
  • 사용 예시 : 데이터베이스 서버 1대에 5대의 웹서버가 접속해 서비스를 하고 있는 상황에서, 5대의 웹 서버가 어떤 정보를 동기화 해야할 경우
  • 또한, 많은 레코드를 한 번에 변경하는 트랜잭션에서도 사용할 수 있다.(데드락 방지)

4.2.4 네임 락

  • 데이터베이스 객체(테이블, 뷰 등)의 이름을 변경하는 경우 획득하는 잠금이다.
  • RENAME TABLE tab_a TO tab_b와 같이 테이블 이름을 변경하는 명령어 수행시 자동으로 획득한다.(명시적으로 획득할 수 있는 방법은 없다)
  • 변경 전 테이블과 변경 후 테이블 모두 한꺼번에 잠금을 설정한다.

참고자료 : Real MySQL - 4.2 MySQL엔진의 잠금


oksusutea's blog

꾸준히 기록하려고 만든 블로그