본문으로 건너뛰기

Locking

1 Locking

  • MySQL에서 사용되는 잠금에는 크게 스토리지 엔진 레벨과 MySQL엔진 레벨로 나눌 수 있다.
  • MySQL엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다.
  • 스토리지 엔진의 잠금은 다른 스토리지 엔진 간 상호 영향을 미치지 않는다.

2 GLOBAL LOCK

  • 글로벌 락은 FLUSH TABLES WITH READ LOCK 명령어로 획들할 수 있다
  • MySQL에서 제공하는 잠금 가운데 가장 범위가 크다
  • 일단 한 세션에서 글로벌 락을 획득하면 다른 세션은 SELECT를 제외한 대부분의 DDL이나 DML 문장을 글로벌 락이 해제될 때까지 대기 상태로 남는다.

3 TABLE LOCK

  • 테이블 락은 개별 테이블 단위로 설정되는 잠금이다.
  • 명시적 또는 묵시적 으로 특정 테이블의 락을 획득할 수 있다.
  • 명시적인 테이블 락고 특별한 상황이 아니면 애플리케이션에서 사용할 일이 없다.
    • 테이블을 잠그는 작업은 온라인 작업에 상당한 영향을 미치기 때문

명시적 방법

  • LOCK TABLES table_name [ READ | WRITE ]
  • 명시적으로 획득한 잠금은 UNLOCK TABLES 명령으로 반납할 수 있다.

묵시적 방법

  • MyISAM의 경우 테이블에 데이터를 변경하는 쿼리를 실행하면 발생한다.
    • MySQL 서버가 데이터가 변경되는 테이블을 잠근한 후 데이터 변경 후 즉시 잠금을 해제한다.
  • InnoDB의 경우 단순 데이터 변경에는 스토리지 엔진 차원에서 레코드 기반 잠금을 제공해 묵시적 테이블 락이 설정되지 않는다.
  • InnoDB의 경우 대부분의 DML 쿼리에서는 테이블 락을 걸지 않고 스키마를 변경하는 DDL의 경우만 테이블 락을 건다.

4 InnoDB 스토리지 엔진의 잠금

  • InnoDB 스토리지 엔진은 레코드 기반 잠금 기능을 제공한다.
  • InnoDB 스토리 엔진에는 레코드 락뿐 아니라 레코드와 레코드 사이의 간격을 잠그는 갭락이 존재한다.

4.1 레코드 락

  • 레코드 자체만을 잠그는 것을 레코드락이라 하며 다른 사용 DMBS의 레코드 락과 동일한 역할을 한다.
  • InnoDB 스토리지의 레코드 락은 레코드 자체가 아니라 인덱스의 레코드를 잠근다.
    • 인덱스가 하나도 없는 테이블이라도 내부적으로 자동 생성된 클러스터 인덱스를 이용해 잠근을 설정한다.

4.2 갭락

  • 갭락은 레코드 자체가 아니라 레코드와 바로 인접한 레코드 사이의 간격만을 잠그는 것을 의미한다.
  • 갭락의 역할을 레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어하는 것이다.

4.3 넥스트 키 락

  • 레코드락과 갭락을 합쳐놓은 형태의 잠금을 넥스트 키 락이라고 한다.