MySQL InnoDB의 락킹 메커니즘: 갭락과 넥스트키 락 이해하기

2025. 5. 29. 01:02·Backend Development
목차
  1. 서론
  2. 팬텀 리드(Phantom Read)란?
  3. 예시 코드
  4. 갭락(Gap Lock)의 개념
  5. 갭락 예시
  6. 넥스트키 락(Next-Key Lock)의 개념
  7. 넥스트키 락 예시
  8. 갭락과 넥스트키 락의 차이점
  9. 팬텀 리드 방지 메커니즘
  10. 결론
  11. 참고 자료
728x90

서론

데이터베이스에서 트랜잭션의 격리성(Isolation)을 보장하기 위한 락킹 메커니즘은 매우 중요합니다. 특히 MySQL InnoDB 엔진은 갭락(Gap Lock)과 넥스트키 락(Next-Key Lock)이라는 독특한 락킹 메커니즘을 제공하여 팬텀 리드(Phantom Read) 현상을 방지합니다. 이 글에서는 이러한 락킹 메커니즘의 개념과 동작 방식을 자세히 살펴보겠습니다.


팬텀 리드(Phantom Read)란?

팬텀 리드는 트랜잭션 격리성과 관련된 중요한 문제입니다. 이는 다음과 같은 상황에서 발생합니다:

  • 트랜잭션 A가 특정 조건으로 데이터를 조회
  • 트랜잭션 B가 새로운 데이터를 삽입
  • 트랜잭션 A가 동일한 조건으로 다시 조회할 때, 이전에 없던 새로운 데이터가 나타남

예시 코드

-- 트랜잭션 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 두 번째 조회
-- 이전 조회에는 없던 새로운 행이 함께 조회됨
SELECT * FROM orders WHERE amount > 150;

갭락(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);

넥스트키 락(Next-Key Lock)의 개념

넥스트키 락은 레코드 락과 갭락을 결합한 형태로, 다음과 같은 특징을 가집니다:

  • 특정 인덱스 레코드와 그 주변의 갭을 동시에 잠금
  • 레코드 자체의 변경과 주변 공간의 변경을 동시에 제어
  • 팬텀 리드 현상을 효과적으로 방지

넥스트키 락 예시

-- orders 테이블 초기 상태
orders_id    orders_amount
1            100
2            200
3            300

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

-- 트랜잭션 A amount = 200인 레코드에 대한 넥스트키 락 설정
SELECT * FROM orders WHERE orders_amount = 200 FOR UPDATE;

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

-- 트랜잭션 B 새로운 레코드 삽입 시도 시, 넥스트키 락으로 인해 차단
INSERT INTO orders (orders_id, order_amount) VALUES (4, 200);

갭락과 넥스트키 락의 차이점

특성 갭락 넥스트키 락
잠금 범위 인덱스 값 사이의 공간 레코드 + 인덱스 값 사이의 공간
주요 목적 새로운 레코드 삽입 방지 레코드 수정 및 새로운 레코드 삽입 방지
사용 시나리오 범위 검색 시 특정 레코드 수정 시

팬텀 리드 방지 메커니즘

갭락과 넥스트키 락은 다음과 같은 방식으로 팬텀 리드를 방지합니다:

  1. 범위 잠금

    • 트랜잭션이 특정 범위의 데이터를 조회할 때 해당 범위에 락 설정
    • 범위 내 새로운 레코드 삽입 차단
  2. 일관성 유지

    • 트랜잭션 내에서 동일한 조회 결과 보장
    • 다른 트랜잭션의 간섭 방지
  3. 성능 고려사항

    • 락 범위가 넓을수록 동시성 감소
    • 적절한 인덱스 설계 필요

결론

갭락과 넥스트키 락은 MySQL InnoDB의 중요한 락킹 메커니즘으로, 데이터의 일관성과 격리성을 보장하는 데 핵심적인 역할을 합니다. 이러한 메커니즘을 이해하고 적절히 활용하면 데이터베이스의 안정성과 성능을 최적화할 수 있습니다.

인사이트: 락킹 메커니즘은 데이터베이스의 안정성을 보장하는 중요한 도구이지만, 과도한 락킹은 성능 저하를 초래할 수 있습니다. 적절한 인덱스 설계와 락킹 전략 수립이 필요합니다.


참고 자료

  • MySQL 8.0 Reference Manual - InnoDB Locking
  • MySQL 8.0 Reference Manual - InnoDB Transaction Model
  • MySQL 8.0 Reference Manual - InnoDB Lock Modes
728x90
저작자표시 비영리 변경금지 (새창열림)

'Backend Development' 카테고리의 다른 글

HTTPS: 웹 보안의 기본, 안전한 통신의 시작  (2) 2025.05.29
스택(Stack) 자료구조: 개념부터 구현까지  (4) 2025.05.29
CORS 이해하기: 크로스 오리진 리소스 공유의 모든 것  (0) 2025.05.29
Spring AOP와 @Transactional: private 메서드에서의 동작 방식  (0) 2025.05.29
네트워크 타임아웃 이해하기: Connection, Socket, Read Timeout  (2) 2025.05.29
  1. 서론
  2. 팬텀 리드(Phantom Read)란?
  3. 예시 코드
  4. 갭락(Gap Lock)의 개념
  5. 갭락 예시
  6. 넥스트키 락(Next-Key Lock)의 개념
  7. 넥스트키 락 예시
  8. 갭락과 넥스트키 락의 차이점
  9. 팬텀 리드 방지 메커니즘
  10. 결론
  11. 참고 자료
'Backend Development' 카테고리의 다른 글
  • HTTPS: 웹 보안의 기본, 안전한 통신의 시작
  • 스택(Stack) 자료구조: 개념부터 구현까지
  • CORS 이해하기: 크로스 오리진 리소스 공유의 모든 것
  • Spring AOP와 @Transactional: private 메서드에서의 동작 방식
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (112) N
      • Frontend Development (47) N
      • Backend Development (25)
      • Algorithm (33)
        • 백준 (11)
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    tailwindcss
    frontend development
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
MySQL InnoDB의 락킹 메커니즘: 갭락과 넥스트키 락 이해하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.