😀 Jerry/면접 질문

[1분 면접] MySQL InnoDB에서 갭락과 넥스트 키 락이 무엇이고, 어떻게 팬텀 리드를 방지하나요?

Jerry_K 2025. 2. 24. 13:11

📌 면접 답변

1. Phantom Read

-- 트랜잭션 A 시작
START TRANSACTION;

-- 트랜잭션 A 첫 번째 조회
SELECT * FROM orders WHERE amount > 150;

-- 트랜잭션 B 시작
START TRANSACTION;

-- 트랜잭션 B 새로운 행 삽입
INSERT INTO orders (customer_id, amount) VALUES (4, 250);

-- 트랜잭션 B 커밋
COMMIT;

-- 동일한 조건으로 트랜잭션 A 두 번째 조회시, 트랜잭션 A의 첫 번째 조회에는 존재하지 않던, 트랜잭션 B에서 삽입된 새로운 행이 함께 조회된다.
-- 단, MVCC를 지원하는 경우 해당 케이스에서 팬텀 리드가 발생하지 않는다.
SELECT * FROM orders WHERE amount > 150;
  • 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에 존재하지 않았던 새로운 행이 나타나는 현상
  • 읽기 일관성 유지하는 과정에서 발생하는 문제
  • 주로 데이터 삽입, 삭제가 다른 트랜잭션에 의해 이뤄질때 발생
  • MVCC를 지원하는 경우 팬텀 리드 발생하지 않음

 

2. Gap Lock 

-- 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);
...
  • 특정 인덱스 값 사이 공간을 잠그는 락
  • 갭 자체를 보호하여, 다른 트랜잭션이 해당 간격에 새로운 행 삽입 차단
  • 기존 레코드 수정하는 것은 가능 
  • 해당 예시에서 Id가 3인 레코드는 수정 가능하지만, 이외 새로 삽입되는 것은 차단
  • 삽입 무결성 유지 

 

3. Next Key Lock

-- 트랜잭션 A 시작
START TRANSACTION;

-- 트랜잭션 A amount = 200인 orders_id = 2 레코드에 대한 레코드 락과 1-2, 2-3에 대한 갭락을 동시에 잠금으로써 넥스트키 락을 설정
SELECT * FROM orders WHERE orders_amount = 200 FOR UPDATE;

-- 트랜잭션 B 시작
START TRANSACTION;

-- 트랜잭션 B orders_id = 4, orders_amount = 200인 레코드 삽입 시도 시, 넥스트키 락으로 인해 차단되어 대기
INSERT INTO orders (orders_id, order_amount) VALUES (4, 200);
  • 넥스트 키 락 = 레코드 락 + 갭락
  • 즉, 레코드와 그 앞뒤 간격까지 모두 락 (갭락과는 다르게 변경도 막음)
  • 레코드 뿐만 아니라 그 주변 공간의 변경도 동시에 제어 가능
  • 다른 트랜잭션이 새로운 레코드 삽입을 방지하여 팬텀 리드 방지
  • 다중 트랜잭션 환경에서 예측 불가능한 데이터 변경 막음

 

4. Gap Lock과 Next key Lock을 통한 Phantom Read 방지 

  • 트랜잭션 A가 특정 범위 데이터 조회 시, 해당 범위에 대해 Gap Lcok 또는 Next key Lock 설정
  • 락 설정 범위 내에서 트랜잭션 B가 새로운 레코드 삽입 또는 기존 레코드 수정 차단 
  • 따라서 트랜잭션 A가 동일한 조건으로 조회 수행하더라도, 트랜잭션 B에 의해 새로운 데이터 삽입 되지 않

📌 내 답변

... ??? 

갭락, 넥스트 키 락, 팬텀 리드가 뭐지 ...


📌 답변 추가 보충

Inno DB 특징

  • 스토리지 엔진
    • 테이블 생성할 때 어떤 방식으로 데이터 저장하고 읽고 쓰는지 결정하는 엔진
  • 트랜잭션 지원 
    • ACID (원자성, 일관성, 독립성, 지속성) 보장
    • BEGIN, COMMIT, ROLLBACK을 통해 트랜잭션 제어
  • MVCC 
    • 여러 트랜잭션이 동시에 읽고 쓸 때 락 대신 MVCC 사용 (성능 높힘)
  • 외래키 지원 
    • 참조 무결성 유지 할 수 있도록 외래키 제약 조건 지원 
    • 참조 무결성은 외래 키로 참조하는 데이터가 반드시 부모 테이블에 존재해야 함
    • 외래키로 테이블 간의 관계 유지 및 부모 테이블과 연결된 데이터 일관성 보장
  • 자동 복구 가능 
  • 버퍼 풀
    • 디스크 성능 최적화를 위해 Buffer Pool을 사용하여 자주 사용하는 데이터 메모리에 캐싱

https://www.maeil-mail.kr/

 

매일메일 - 기술 면접 질문 구독 서비스

기술 면접 질문을 매일매일 메일로 보내드릴게요!

www.maeil-mail.kr

매일 메일의 면접 질문 정리