InnoDB에서 락은 인덱스를 기반으로 잠기게 된다. 이게 무슨 말이냐면 클러스터링/보조 인덱스를 타며 탐색하는 데이터를 기준으로 잠금을 수행하는 것이다.
따라서, 인덱스가 없다면 클러스터 인덱스를 타며 디스크를 풀스캔하는 과정 중 모든 데이터를 넥스트키락으로 잠근다. 보조 인덱스가 있다면 보조인덱스를 타는 과정에서 탐색할 후보 데이터와 그 사이의 갭을 잠근다.
기본적으로 PK와 유니크 컬럼은 자동으로 인덱스가 설정된다. 그리고 이 두 컬럼을 기준으로 락을 잡을 때는 넥스트키락으로 주변이 아닌 해당 레코드들만 잠그는 것이다. 따라서, 가능하다면 PK와 유니크키를 중심으로 인덱스를 잡아야 처리량이 높아질 것이다.

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

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

ID가 3번인 레코드에 대해서만 락이 잡혀있기 때문에 해당 레코드의 락을 잡을순 없지만, 다른 곳에 삽입/조회를 위한 락을 잡을 순 있다.
PK와 유니크키가 아닌 경우 + 인덱스가 걸려있지 않을 때
