반응형
서론
데이터베이스에서 트랜잭션의 격리성(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);
갭락과 넥스트키 락의 차이점
특성 | 갭락 | 넥스트키 락 |
---|---|---|
잠금 범위 | 인덱스 값 사이의 공간 | 레코드 + 인덱스 값 사이의 공간 |
주요 목적 | 새로운 레코드 삽입 방지 | 레코드 수정 및 새로운 레코드 삽입 방지 |
사용 시나리오 | 범위 검색 시 | 특정 레코드 수정 시 |
팬텀 리드 방지 메커니즘
갭락과 넥스트키 락은 다음과 같은 방식으로 팬텀 리드를 방지합니다:
범위 잠금
- 트랜잭션이 특정 범위의 데이터를 조회할 때 해당 범위에 락 설정
- 범위 내 새로운 레코드 삽입 차단
일관성 유지
- 트랜잭션 내에서 동일한 조회 결과 보장
- 다른 트랜잭션의 간섭 방지
성능 고려사항
- 락 범위가 넓을수록 동시성 감소
- 적절한 인덱스 설계 필요
결론
갭락과 넥스트키 락은 MySQL InnoDB의 중요한 락킹 메커니즘으로, 데이터의 일관성과 격리성을 보장하는 데 핵심적인 역할을 합니다. 이러한 메커니즘을 이해하고 적절히 활용하면 데이터베이스의 안정성과 성능을 최적화할 수 있습니다.
인사이트: 락킹 메커니즘은 데이터베이스의 안정성을 보장하는 중요한 도구이지만, 과도한 락킹은 성능 저하를 초래할 수 있습니다. 적절한 인덱스 설계와 락킹 전략 수립이 필요합니다.
참고 자료
반응형
'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 |