728x90
반응형
Gap Lock이란 무엇인가요?
갭 락은 특정 인덱스 값 사이의 공간을 잠그는 락입니다. 기존 레코드 간의 간격을 보호하여 새로운 레코드의 삽입을 방지합니다. 갭 락은 범위 내에 특정 레코드가 존재하지 않을 때 적용됩니다. 트랜잭션이 특정 범위 내에서 데이터의 삽입을 막아 팬텀 읽기(Phantom Read) 현상을 방지합니다. 예를 들어, 인덱스 값 10과 20 사이의 갭을 잠그면 이 범위 내에 새로운 레코드 15를 추가할 수 없습니다.
// id 1, 3, 5가 저장된 orders 테이블
// 트랜잭션 A 시작
START TRANSACTION;
// 트랜잭션 A 1-3과 3-5 사이의 갭과 3 레코드 락 설정(넥스트키 락)
SELECT * FROM orders WHERE orders_id BETWEEN 2 AND 4 FOR UPDATE;
// 트랜잭션 B 시작
START TRANSACTION;
// 트랜잭션 B가 id 4에 데이터 삽입 시도 시, 갭락으로 인해 삽입이 차단되어 대기
INSERT INTO orders (orders_id, orders_amount) VALUES (4, 200);
🔒 갭 락(Gap Lock)과 트랜잭션 대기 메커니즘
💡 개념 정리
- 갭 락(Gap Lock)**은 InnoDB 스토리지 엔진에서 사용하는 레코드 간 “공백” 범위에 대한 잠금입니다.
- SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE 또는 내부적인 인덱스 스캔 등에서 사용됩니다.
- 삽입 차단이 목적이며, 이미 있는 레코드에 대한 락은 **레코드 락(Row Lock)**이 사용됩니다.
- 팬텀 리드 방지를 위해 반드시 필요한 메커니즘입니다 (특히 REPEATABLE READ 이상에서).
⚠️ 주의할 점
- 락 대기가 너무 오래 지속되면 **InnoDB 설정에 따라 타임아웃(예: innodb_lock_wait_timeout)**이 발생하여 트랜잭션 B가 실패할 수 있습니다.
- 따라서 락 대기 및 데드락 회피 전략도 실무에서는 중요합니다.
⚠️ 주요 트랜잭션 동시성 문제
구분 | 설명 | 예시 |
Dirty Read | 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽음 | B 트랜잭션에서 UPDATE 후 아직 커밋 전인 값을 A가 읽음 |
Non-repeatable Read | 같은 조건으로 두 번 SELECT했을 때 값이 바뀌어 있음 | B 트랜잭션에서 A 도중 UPDATE 후 커밋 → A의 두 번째 조회 결과 변경됨 |
Phantom Read | 같은 조건으로 두 번 SELECT했을 때 행 수가 바뀌어 있음 | B 트랜잭션이 A 도중 INSERT 후 커밋 → A의 두 번째 조회에 새 행이 추가됨 |
https://www.maeil-mail.kr/question/93
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
728x90
반응형
'매일 공부 > Backend CS' 카테고리의 다른 글
[매일메일] 리버스 프록시와 포워드 프록시 (0) | 2025.04.11 |
---|---|
[매일메일] 넥스트키 락(Next-Key Lock)이란? (0) | 2025.04.09 |
[매일메일] 팬텀 리드(Phantom Read) 란? (0) | 2025.04.09 |
[매일메일] 데이터베이스 시스템 동시성 제어 (MVCC, Lock-Based Concurrency Control) (0) | 2025.04.08 |
[매일메일] HTTP 메서드에서 멱등성이란 (0) | 2025.04.07 |