[MySQL] 잠금에 대해
by 키위먹고싶다MySQL에서 사용되는 잠금은 MySQL 엔진 레벨과 스토리 엔진 레벨이 있다.
MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진 전체에 영향을 미치며, 스토리 엔진 레벨의 잠금은 스토리 엔진 간에 영향을 미치지 않는다.
MySQL 엔진_글로벌 락
글로벌 락은 락 중에서 가장 범위가 크다. 명령어 실행 동시에 MySQL 서버에 존재하는 모든 테이블에 잠금을 건다. 한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 대부분의 DDL문장이나 DML문장을 실행하는 경우 글로벌 락이 해제될 때까지 해당 쿼리가 대기 상태로 남게 된다. 그러나 글로벌 락은 테이블 잠금을 걸기 전에 플러시를 하기 때문에 글로벌 락 명령어 전에 실행되던 잠금과 쿼리가 있다면 이것이 끝나야 글로벌 락이 실행된다.
이처럼 글로벌 락은 테이블 MySQL 서버의 모든 테이블에 영향을 미치며 이로 인해 INSERT, UPDATE, DELETE가 오랜 시간 실행되지 못할 수도 있으므로 가급적 사용을 지양한다.
MySQL 엔진_테이블 락
개별 테이블 단위로 설정되는 잠금. 명시적과 묵시적 잠금이 있다.
명시적 잠금
- LOCK TABLES table_name [READ | WRITE] -> 잠금 획득
- UNLOCK TABLES -> 잠금 해제
- MyISAM과 InnoDB 스토리 엔진을 사용하는 테이블 둘 다 동일하게 설정
묵시적 잠금
- MyISAM, MEMORY 테이블은 데이터를 변경하는 쿼리가 실행되면 자동으로 락을 획득하고 완료되면 자동으로 해제.
- InnoDB는 테이블 기반이 아니라 레코드 기반의 잠금을 제공하므로 단순 데이터 변경 쿼리로 인해 묵시적 락이 설정되지 않는다. DML 말고 DDL 등 스키마를 변경할 때 영향을 미친다.
MySQL 엔진_네임드 락
네임드 락은 임의의 문자열에 대해 잠금을 설정할 수 있다. 특징은 테이블이나 레코드 AUTO_INCREMENT와 같은 객체가 아니라 사용자가 지정한 단순 문자열을 획득하고 반납하는 것이다.
GET_LOCK()으로 해당 문자열에 5초 잠금 설정한다. 5초 후에 자동 잠금 해제.
IS_USED_LOCK()을 사용하면 커넥션 아이디를 반환받는다. 해당 문자열에 대해 잠금이 없으면 NULL을 반환한다.
RELEASE_LOCK()으로 해당 문자열에 대해 잠금 해제.
해당 문자열은 잠금이 해제됐으므로 문자열에 대해 잠금을 확인하면 결과가 NULL값이다.
MySQL 엔진_메타데이터 락
테이블이나 뷰의 이름이나 구조를 변경하는 경우 획득하는 잠금이다. 명시적으로 획득되는 것이 아니라 테이블의 이름을 변경할 때 자동으로 획득하는 잠금이다. 실시간으로 테이블을 바꿔야 하는 배치 프로그램에서 자주 발생한다. RENAME TABLE과 같은 경우. 새로운 테이블에 기존 테이블 값을 복사할 경우.
InnoDB 스토리 엔진_레코드 락
레코드 자체를 잠그는 게 아니라 인덱스의 레코드를 잠근다. 프라이머리 키 , 유니크 인덱스에 의한 변경 작업에서 레코드 자체에 대해서만 락을 건다.
InnoDB 스토리 엔진_갭 락
레코드가 아니라 레코드와 인접한 레코드 사이의 간격을 잠그는 것을 의미한다. 레코드 사이에 새로운 레코드가 INSERT 되는 것을 제어한다.
InnoDB 스토리 엔진_넥스트 키 락
레코드 락과 갭 락을 합쳐 놓은 형태의 잠금이다.
InnoDB 스토리 엔진_자동 증가 락
AUTO_INCREMENT 가 사용된 테이블에 동시에 여러 레코드가 INSERT 되는 경우 저장 순서대로 증가하는 번호를 가져야 한다. InnoDB 스토리 엔진에서는 AUTO_INCREMENT 락이라고 하는 테이블 수준의 잠금을 사용한다. 새로운 레코드를 저장하는 쿼리에서만 사용되며 UPDATE, DELETE에서는 걸리지 않는다. 레코드 락, 넥스트 키락과 달리 트랜잭션과 관계없이 AUTO_INCREMENT값을 가져올 때만 락이 걸렸다가 즉시 해제된다. 동시에 INSERT쿼리가 실행될 경우 그다음 쿼리는 먼저 실행된 AUTO_INCREMENT락이 해제될 때까지 기다려야 한다.
'db' 카테고리의 다른 글
MySQL 옵티마이저 실행계획 (0) | 2023.06.24 |
---|---|
뮤텍스(Mutex)와 세마포어(Semaphore) (0) | 2022.06.18 |
[MySQL] 바이너리 로그 (0) | 2022.06.18 |
Mysql Redo / Undo Log (0) | 2022.04.16 |
다중 버전 동시성 제어[multiversion concurrency control, MCC, MVCC] (0) | 2022.04.08 |
블로그의 정보
kiwi
키위먹고싶다