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

2025. 5. 29. 01:02·Backend Development
반응형

서론

데이터베이스에서 트랜잭션의 격리성(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
반응형
저작자표시 비영리 변경금지 (새창열림)

'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
'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⋯
  • 블로그 메뉴

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

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    frontend development
    tailwindcss
  • 최근 댓글

  • 최근 글

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

티스토리툴바