Backend Development

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

Kun Woo Kim 2025. 5. 29. 01:02
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의 중요한 락킹 메커니즘으로, 데이터의 일관성과 격리성을 보장하는 데 핵심적인 역할을 합니다. 이러한 메커니즘을 이해하고 적절히 활용하면 데이터베이스의 안정성과 성능을 최적화할 수 있습니다.

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


참고 자료

728x90