InnoDB 기본 잠금 방식

Next-Key Lock은 앞의 갭과 대상 레코드를 한 번에 묶는다

인덱스에서 대상 행 하나만 잡는 것이 아니라, 그 행 직전 빈 구간까지 함께 보호합니다. 그래서 같은 범위에 새 행이 끼어드는 것과 기존 행을 바꾸는 것을 동시에 막을 수 있습니다.

인덱스 순서에서 실제로 잠기는 범위
(10, 13] = Gap + Record
10
앞 갭
INSERT 11, 12 차단
13
대상 레코드
다음 갭
14, 15는 별개
16
구성 요소
무엇을 잠그나
왜 중요한가
Gap Lock
대상 레코드 바로 앞의 빈 인덱스 구간
(10, 13) 안으로 들어오는 새 INSERT를 막습니다.
같은 범위에 새 행이 생겨 조회 결과가 달라지는 현상을 줄입니다.
Record Lock
현재 읽거나 찾은 실제 레코드
id = 13 자체에 대한 변경을 막습니다.
기존 행이 바뀌지 않게 유지해서 트랜잭션의 읽기 일관성을 지킵니다.
핵심
Next-Key Lock = Gap Lock + Record Lock입니다. 즉, InnoDB는 한 레코드만 보는 것처럼 보여도 실제로는 그 앞의 범위 + 레코드를 함께 잠가 팬텀 삽입 가능성을 줄입니다.