갭락·넥스트키 락을 단순히 "잠금 종류" 정도로 외워 왔는지, 아니면 팬텀 리드와 실행 계획·인덱스 설계까지 연결할 수 있는지를 가른다.
갭락은 인덱스 레코드 사이의 "빈 구간" 자체를 잠가, 그 구간에 새 행이 INSERT되는 걸 막는 잠금이다. 넥스트키 락은 레코드 락 + 그 앞 갭 락을 묶어서 거는 잠금이다. REPEATABLE READ에서 범위 조건 조회(SELECT ... FOR UPDATE, UPDATE ... WHERE 등)에 넥스트키 락이 걸리면, 같은 트랜잭션에서 재조회해도 새 행이 끼어들지 못해 팬텀 리드가 안 보인다. 잠금 범위는 인덱스를 어떻게 타느냐에 따라 크게 달라지기 때문에, 인덱스 설계가 어긋나면 의도보다 훨씬 넓은 구간이 잠겨 동시성이 뚝 떨어진다.
범위 UPDATE가 의외로 넓게 잠겨 lock wait timeout을 본 경험이 있다면 "실행 계획이 갭락 범위를 정한다"는 일반화로 풀어낼 수 있다
팬텀 리드를 재현해 격리 수준 차이를 검증해 본 경험이 있다면 넥스트키 락의 역할을 사례로 보여 줄 수 있다
인덱스 추가로 잠금 범위가 좁아져 동시성이 회복된 경험이 있다면 인덱스 설계와 잠금의 연결로 일반화할 수 있다
아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.