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

Kun-Woo Kim·2025년 4월 30일

Backend Development

목록 보기
4/27
post-thumbnail

서론

데이터베이스에서 트랜잭션의 격리성(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의 중요한 락킹 메커니즘으로, 데이터의 일관성과 격리성을 보장하는 데 핵심적인 역할을 합니다. 이러한 메커니즘을 이해하고 적절히 활용하면 데이터베이스의 안정성과 성능을 최적화할 수 있습니다.

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


참고 자료

profile
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, Next.js 14, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.

0개의 댓글