레코드 자체만을 잠그는 것을 Record lcok이라고 한다.
다른 상용 DBMS 레코드 락과 동일한 역할을 하지만 MySQL의 InnoDB 엔진은 레코드가 아니라 인덱스의 레코드를 잠근다는 특징이 있다.
인덱스에 잠금을 걸기 때문에 인덱스를 올바르게 설정하는 것이 성능에 매우 중요한데,
예제를 통해서 확인해보자.
아래와 같은 member 테이블이 있고, PK를 제외하곤 다른 컬럼에 인덱스가 걸려있지 않은 상태이다.

이 상태에서 name이 'Grace Lee'인 member의 hire_date를 update하는 쿼리를 수행하면 record lock이 어떻게 걸릴까?

[인덱스가 없는 경우]
name 컬럼은 인덱스가 없기 때문에 전체 건수인 10건의 레코드가 모두 잠긴다.
해당 예제에는 작은 건수의 레코드지만 수천만건의 데이터를 가진 테이블이었다면 한 세션에서 UPDATE 진행 중 동시성이 많이 떨어져서 전체 성능도 많이 떨어졌을 것으로 예상된다.
[인덱스가 있는 경우]
name 컬럼에 인덱스가 생성되어 있으므로 검색 대상 레코드에만 잠금이 걸린다.
자세히 보면 검색 대상 다음 행에 GAP Lock이 함께 걸리는 것을 확인할 수 있는데,
트랜잭션 격리 레벨 중 REPEATABLE READ인 경우 Phantom read 현상을 방지하기 위해 같이 수행된다.

위 예제로 인덱스 설계가 단순히 검색 성능을 향상 시키려는 목적 뿐만 아니라 Record lock에서 불필요한 lock을 방지하기 위해서도 중요하다는 점을 알 수 있다.