매일 공부/Backend CS

[매일메일] 넥스트키 락(Next-Key Lock)이란?

개발하는 동그리 2025. 4. 9. 10:42
728x90
반응형
Next-Key Lock이란 무엇인가요?

 

넥스트키 락 레코드 락 갭락을 결합한 형태로, 특정 인덱스 레코드와 그 주변의 갭을 동시에 잠그는 락입니다. 이를 통해 레코드 자체의 변경과 함께 그 주변 공간의 변경도 동시에 제어할 수 있습니다.

넥스트키 락은 특정 레코드와 그 주변 공간을 잠그기 때문에, 다른 트랜잭션이 새로운 레코드를 삽입하여 팬텀 리드를 발생시키는 것을 방지합니다.

 

orders_id | orders_amount
----------|---------------
1         | 100
2         | 200
3         | 300

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

// 트랜잭션 A amount = 200인 orders_id = 2 레코드에 대한 레코드 락과 1-2, 2-3에 대한 갭락을 동시에 잠금으로써 넥스트키 락을 설정
SELECT * FROM orders WHERE orders_amount = 200 FOR UPDATE;

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

// 트랜잭션 B orders_id = 4, orders_amount = 200인 레코드 삽입 시도 시, 넥스트키 락으로 인해 차단되어 대기
INSERT INTO orders (orders_id, order_amount) VALUES (4, 200);

 

갭락과 넥스트키 락을 통한 팬텀 리드 방지 메커니즘

트랜잭션 A가 특정 범위의 데이터를 조회할 때, 해당 범위에 대해 갭락 또는 넥스트키 락을 설정합니다. 락이 설정된 범위 내에서는 트랜잭션 B가 새로운 레코드를 삽입하거나 기존 레코드를 수정하는 것이 차단됩니다. 따라서, 트랜잭션 A가 다시 동일한 조건으로 조회를 수행하더라도, 트랜잭션 B에 의해 새로운 데이터가 삽입되지 않아 팬텀 리드가 발생하지 않습니다.


✅ 정의

넥스트 키 락은 레코드 락(Record Lock)과 갭 락(Gap Lock)을 결합한 형태의 락입니다.
즉, 특정 인덱스 레코드와 그 앞뒤 구간(Gap)까지 동시에 잠금합니다.

 

✅ 목적

레코드 자체를 보호 (예: UPDATE, DELETE 방지)
해당 레코드 근처의 삽입을 방지 (예: 팬텀 리드 방지)
트랜잭션 격리 수준, 특히 REPEATABLE READ에서 일관된 데이터 스냅샷 유지
orders_id | orders_amount
----------|---------------
1         | 100
2         | 200
3         | 300

START TRANSACTION;
SELECT * FROM orders WHERE orders_amount = 200 FOR UPDATE;

 

락 종류  범위
레코드 락 orders_id = 2 (정확한 해당 레코드)
갭 락 orders_id 1과 2 사이, 2와 3 사이의 범위
→ 넥스트 키 락 레코드 + 양쪽 갭 → 1–2, 2, 2–3 전체가 잠김

 

 

https://www.maeil-mail.kr/question/93

 

매일메일 - 기술 면접 질문 구독 서비스

기술 면접 질문을 매일매일 메일로 보내드릴게요!

www.maeil-mail.kr

 

728x90
반응형