넥스트키 락
넥스트키 락은 InnoDB에서 레코드 락과 갭 락을 결합해 특정 인덱스 레코드와 그 앞의 공간을 함께 잠그는 락입니다.
동작 방식
넥스트키 락은 존재하는 인덱스 레코드를 잠그는 동시에, 그 레코드 앞의 갭도 잠급니다. 이를 통해 기존 레코드의 변경과 범위 안의 새 레코드 삽입을 함께 제어합니다.
인덱스 값: 10, 20, 30
넥스트키 락 범위 예:
(-∞, 10]
(10, 20]
(20, 30]
(30, +∞)
팬텀 리드 방지
트랜잭션이 범위 조건으로 데이터를 조회하면서 넥스트키 락을 잡으면, 다른 트랜잭션은 해당 범위에 새 레코드를 삽입할 수 없습니다. 따라서 같은 조건으로 다시 조회해도 새로운 행이 나타나는 팬텀 리드를 막을 수 있습니다.
주의사항
- 인덱스를 기준으로 잠금 범위가 결정됩니다.
- 적절한 인덱스가 없으면 더 넓은 범위가 잠겨 동시성이 크게 떨어질 수 있습니다.
- 팬텀 리드를 막는 대신 삽입 대기가 늘어날 수 있습니다.
핵심 정리
넥스트키 락은 레코드와 갭을 함께 잠가 범위 조회의 일관성을 지킵니다.
InnoDB가 팬텀 리드를 방지하는 대표적인 잠금 메커니즘입니다.