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 컬럼에 중복되지 않고 저장된 순서대로 증가한 일련번호 값을 저장하기 위해 사용
- Insert와 Replace 같은 새로운 레코드를 저장하는 쿼리에만 필요
- AUTO_INCREMENT 값을 가져오는 순간만 락이 걸렸다가 즉시 해제
InnoDB의 잠금
- 레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식으로 처리
- 인덱스에 따라 잠금이 결정되어 인덱스 설정이 중요하며 인덱스가 없을 경우 풀스캔 하면서 모든 레코드를 잠금한다.
'Database' 카테고리의 다른 글
[mysql] 무중단으로 대량 테이블 전체 데이터 교체하기 (0) | 2017.04.04 |
---|---|
[mysql] rownum을 결과에 반환하기 (0) | 2017.03.16 |