갭 락
갭 락은 InnoDB에서 인덱스 레코드 사이의 빈 공간을 잠가 해당 범위에 새로운 레코드가 삽입되는 것을 막는 락입니다.
왜 필요한가
레코드 락은 이미 존재하는 행을 보호합니다. 하지만 범위 조회 조건에 해당하는 새 행이 삽입되는 것은 레코드 락만으로 막기 어렵습니다. 갭 락은 인덱스 값 사이의 공간을 잠가 팬텀 리드를 방지하는 데 사용됩니다.
예시
인덱스 값: 10, 20
갭: (-∞, 10), (10, 20), (20, +∞)
10과 20 사이의 갭이 잠기면, 다른 트랜잭션은 이 범위에 15 같은 새 값을 삽입할 수 없습니다.
특징
- 실제 레코드가 아니라 인덱스 사이의 범위를 잠급니다.
- 동시 삽입을 제한하므로 동시성은 낮아질 수 있습니다.
- InnoDB의 반복 읽기 격리 수준에서 잠금 읽기와 함께 사용됩니다.
갭 락 vs 넥스트키 락
| 항목 | 갭 락 | 넥스트키 락 |
|---|---|---|
| 잠금 대상 | 인덱스 사이의 공간 | 레코드와 그 앞의 갭 |
| 목적 | 새 레코드 삽입 방지 | 레코드 변경과 범위 삽입 방지 |
| 팬텀 리드 방지 | 가능 | 가능 |
핵심 정리
갭 락은 범위 안에 새 레코드가 삽입되는 것을 막아 팬텀 리드를 방지합니다.