레코드 락, 갭 락, 넥스트키 락


의미

InnoDB 엔진은 인덱스를 기반으로 넥스트키 락을 건다.

InnoDB에서 락은 인덱스를 기반으로 잠기게 된다. 이게 무슨 말이냐면 클러스터링/보조 인덱스를 타며 탐색하는 데이터를 기준으로 잠금을 수행하는 것이다.

따라서, 인덱스가 없다면 클러스터 인덱스를 타며 디스크를 풀스캔하는 과정 중 모든 데이터를 넥스트키락으로 잠근다. 보조 인덱스가 있다면 보조인덱스를 타는 과정에서 탐색할 후보 데이터와 그 사이의 갭을 잠근다.

PK, 유니크 컬럼은 레코드락만 수행한다.

기본적으로 PK와 유니크 컬럼은 자동으로 인덱스가 설정된다. 그리고 이 두 컬럼을 기준으로 락을 잡을 때는 넥스트키락으로 주변이 아닌 해당 레코드들만 잠그는 것이다. 따라서, 가능하다면 PK와 유니크키를 중심으로 인덱스를 잡아야 처리량이 높아질 것이다.

실험 - users 테이블

image.png

PK와 유니크키로 잠금을 수행하는 경우

image.png

PK인 id 기준으로 레코드락을 잡는다.

image.png

ID가 3번인 레코드에 대해서만 락이 잡혀있기 때문에 해당 레코드의 락을 잡을순 없지만, 다른 곳에 삽입/조회를 위한 락을 잡을 순 있다.

PK와 유니크키가 아닌 경우 + 인덱스가 걸려있지 않을 때

image.png