InnoDB 기본 잠금

Next-Key Lock은 레코드와 그 앞 갭을 한 묶음으로 잠근다

핵심은 기존 행 보호범위 안 새 행 유입 차단을 동시에 만족시키는 것입니다. 그래서 InnoDB는 레코드만 따로 잠그지 않고, 그 레코드 앞의 인덱스 갭까지 함께 잠급니다.

잠금 단위

Next-Key Lock
=
Gap Lock
+
Record Lock
예시: 인덱스에서 값 20을 잠글 때
한 번의 Next-Key Lock이 실제로 잡는 범위
이전 레코드
10
앞 갭
(10, 20)
새 INSERT 대기
대상 레코드
20
기존 행 변경 충돌
다음 갭
(20, 30)
이번 잠금 단위 밖
다음 레코드
30
눈여겨볼 점은 빈 공간도 잠금 대상이라는 것입니다. 그래서 범위를 다시 읽을 때 중간에 새 값이 끼어들어 결과 집합이 달라지는 상황을 줄일 수 있습니다.

각 구성 요소가 맡는 역할

Gap Lock
인덱스 사이 빈 구간
잠긴 갭 안으로 새 레코드가 INSERT되는 것을 막아 범위가 커지는 일을 차단합니다.
Record Lock
이미 존재하는 레코드
현재 읽은 행 자체를 보호해서 다른 트랜잭션의 UPDATE/DELETE와 충돌하게 만듭니다.
Next-Key Lock
레코드 + 그 앞 갭
두 잠금을 묶어서, 기존 행 변경과 범위 안 새 행 유입을 함께 막는 InnoDB의 기본 방식입니다.