매일 공부/Backend CS

[매일메일] 갭락(Gap Lock)이란?

개발하는 동그리 2025. 4. 9. 10:36
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
반응형