본문 바로가기

Database

[Mysql] 잠금(Lock) 정리


Mysql 잠금


글로벌 락(Global Lock)

-       FLUSH TABLES WITH READ LOCK 명령으로 획득할 수 있으며, mysql에서 제공하는 잠금 가운데 가장 범위가 크다.

-       한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 대부분의 DDL이나 DML을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기상태로 남는다.

-       MyISAM이나 MEMORY 테이블에 대해 mysqldump로 일관된 백업을 받아야 할 때 글로벌 락을 사용해야 한다.

 

 

테이블 락(Table Lock)

-       개별 테이블 단위로 설정되는 잠금

-       LOCK TABLES table_name [READ | Write] 명령으로 특정 테이블의 락을 획득 할 수 있다.

-       명시적으로 획득한 잠금은 UNLOCK TABLES 명령으로 잠금을 반납할 수 있따.

-       글로벌 락과 동일하게 온라인 작업에 상당한 영향을 미친다.

-       MyISAM이나 MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 발생한다.

-       InnoDB 테이블은 스키마를 변경하는 DDL의 경우에만 발생

 

유저 락(User Lock)

-       GET_LOCK() 함수를 이용해 잠금 설정

-       단순히 사용자가 지정한 문자열에 대해 획득하고 반납

-       여러 클라이언트가 상호 동기화를 처리하는 경우 유용

-       많은 레코드를 한번에 변경하는 경우에 유용

 

네임 락(Name Lock)

-       데이터베이스 객체의 이름을 변경하는 경우 획득

-       명시적으로 획득하거나 해제할 수 있는 것이 아님

 

InnoDB의 잠금 종류

 

레코드 락(Record lock)

-       레코드 자체에 잠금을 거는 것

-       InnoDB의 경우 인덱스의 레코드를 잠근다.

 

갭 락(Gap lock)

-       레코드 그 자체가 아니라 레코드와 인접한 레코드 사이의 간격을 잠그는 것

-       레코드와 레코드 사이의 간격에 새로운 레코드가 생성되는 것을 제어

 

넥스트 키 락(Next key lock)

-       레코드 락과 갭 락을 합쳐 놓은 형태의 잠금

-       바이너리 로그에 기록되는 쿼리가 슬레이브에서 실행될 때 마스터에서 만든 결겨와 동일한 결과를 만드는 것이 주 목적

 

자등 증가 락(Auto increment lock)

-       AUTO_INCREMENT 컬럼에 중복되지 않고 저장된 순서대로 증가한 일련번호 값을 저장하기 위해 사용

-       InsertReplace 같은 새로운 레코드를 저장하는 쿼리에만 필요

-       AUTO_INCREMENT 값을 가져오는 순간만 락이 걸렸다가 즉시 해제

 

InnoDB의 잠금

-       레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식으로 처리

-       인덱스에 따라 잠금이 결정되어 인덱스 설정이 중요하며 인덱스가 없을 경우 풀스캔 하면서 모든 레코드를 잠금한다.