본문 바로가기

cs(with 매일메일)

[251017금] MySQL InnoDB에서 갭락과 넥스트키 락이란 무엇이며, 어떻게 팬텀 리드를 방지하나요?

팬텀 리드(Pantom Read)란?

정의 : 트랜잭션이 동일한 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에는 존재하지 않았던 새로운 데이터가 나타남

원인 : 주로 읽기 읽관성(Read Consistency)을 유지하는 과정에서 발생 > 데이터의 삽입, 삭제가 다른 트랜잭션에 의해 이뤄질 때

-- 트랜잭션 A시작
START TRANSECTION;

-- 트랜잭션 A 첫 번째 조회
SELECT * FROM orders WHERE amount > 150;

-- 트랜잭션 B 시작
START TRANSETCION;

-- 트랜잭션 B 새로운 행 삽입
INSERT INTO orders() VALUES(4, 250);

-- 트랜잭션 B 커밋
COMMIT;

-- 동일한 조건으로 트랜잭션 A 두번째 조회시, 트랜잭션 A의 첫번째 조회에서는 존재하지 않던,
-- 트랜잭션 B에서 삽입된 새로운 행이 함께 조회된다.
-- 단, MVCC를 지원하는 경우 해당 케이스에서 팬텀 리드가 발생하지 않음. 
SELECT * FROM orders WHERE amount > 150;

 

갭락(Gap Lock)이란?

정의 : 특정 인덱스 값 사이의 공간을 잠그는 락

특징

  - 기존 레코드 간의 간격을 보호하여 새로운 레코드의 삽입을 방지

  - 범위 내의 특정 레코드가 존재하지 않을때 적용

  - 트랜잭션이 특정 범위 내에서 데이터의 삽입을 막아 팬텀 리드 현상을 방지

 

 

넥스트키 락(Next-Key Lock)이란?

정의 : 레코드 락 +  갭락

특징

  - 특정 인덱스 레코드와 그 주병의 갭을 동시에 잠그는 락

  - 레코드 자체의 변경과 그 주변의 변경도 동시에 제어 가능

  - 트랜잭션이 새로운 레코드를 삽입을 막아 팬텀 리드 현상을 방지

 

 

갭락과 넥스트키 락을 통한 팬텀 리드방지 매커니즘

: 트랜잭션A가 특정 범위의 데이터를 조회할때, 해당 범위에 대한 갭락 또는 넥스트키락을 설정합니다. 그러면 트랜잭션 B는 해당 범위의 레코드를 수정하거나 새로 삽입할 수 없기에, 트랜잭션A가 다시 동일한 조건으로 조회를 수행하더라도, 팬텀 리드가 발생하지 않습니다. 

 

 

 

=====

✨ InnoDB란?

정의 : MySQL 데이터베이스 시스템에서 사용되는 데이터베이스 엔진(트랜잭션 세이프 스토리지 엔진) 중 하나이다.