MySQL에서는 자동 증가하는 숫자 값을 추출하기 위해 AUTO_INCREMENT라는 컬럼 속성을 제공하고 있다. AUTO_INCREMENT 컬럼이 사용된 테이블에 동시에 여러 레코드가 INSERT되는 경우 어떠한 방식으로 잠금이 진행되는지 알아본다.
선정 이유
우리는 PK에 자동으로 id을 증가 시키기 위해 AUTO_INCREMENT 설정을 자주 사용하곤 한다. 이때 내부적으로 어떠한 방식으로 잠금이 일어나는지 알아보기 위해 선정했다.
해당 텍스트
MySQL에서는 자동 증가하는 숫자 값을 추출하기 위해 AUTO_INCREMENT라는 컬럼 속성을 제공하고 있다. AUTO_INCREMENT 컬럼이 사용된 테이블에 동시에 여러 레코드가 INSERT되는 경우 InnoDB 스토리지 엔진은 내부적으로 auto increment lock이라는 테이블 수준의 잠금을 사용하고 있다.
auto increment lock은 명시적으로 획득할 수 없다. 오직 레코드가 INSERT되는 시점에 아주 잠깐이 시간 동안 걸렸다가 해제 되기 때문에 대부분의 경우 문제를 일으키지 않았다.
지금까지의 설명은 MySQL 5.0 이하 버전에서 사용되던 방식이다.
MySQL 5.1 이상
MySQL 5.1 이상 부터는 innodb_autonic_lock_mode라는 시스템 변수를 통해 auto increment lock의 작동 방식을 변경할 수 있다.
innodb_autonic_lock_mode=0: MySQL 5.0과 동일한 잠금 방식을 제공한다. 모든 INSERT 문장은 auto increment lock을 사용한다.
innodb_autonic_lock_mode=1 (Consecutive mode): 단순히 한 건 또는 여러 건의 레코드를 INSERT하는 SQL 중에 MySQL 서버가 레코드 건수를 정확히 예측하는 경우에는 auto increment lock을 사용하지 않는다. 대신 훨씬 가볍고 빠른 래치(뮤텍스)를 이용해 처리한다.
래치 (latch)
InnoDB의 내부 메모리 구조에 대한 락을 구현하기 위해 사용되는 경량의 구조로 일반적으로 밀리초, 마이크로초 단위의 짧은 시간 동안 유지된다.
innodb_autonic_lock_mode=2 (Interleaved mode): 절대 auto increment lock을 사용하지 않고 경량화된 래치(뮤텍스)를 사용한다. 특징으로는 연속된 자동 증가 값을 보장하지 않는다.
MySQL 8.0 버전 부터는 innodb_autonic_lock_mode의 기본값이 2로 변경되었다.
주제
MySQL에서는 자동 증가하는 숫자 값을 추출하기 위해
AUTO_INCREMENT
라는 컬럼 속성을 제공하고 있다.AUTO_INCREMENT
컬럼이 사용된 테이블에 동시에 여러 레코드가INSERT
되는 경우 어떠한 방식으로 잠금이 진행되는지 알아본다.선정 이유
우리는 PK에 자동으로 id을 증가 시키기 위해
AUTO_INCREMENT
설정을 자주 사용하곤 한다. 이때 내부적으로 어떠한 방식으로 잠금이 일어나는지 알아보기 위해 선정했다.해당 텍스트
MySQL에서는 자동 증가하는 숫자 값을 추출하기 위해
AUTO_INCREMENT
라는 컬럼 속성을 제공하고 있다.AUTO_INCREMENT
컬럼이 사용된 테이블에 동시에 여러 레코드가INSERT
되는 경우InnoDB
스토리지 엔진은 내부적으로auto increment lock
이라는 테이블 수준의 잠금을 사용하고 있다.auto increment lock
은 명시적으로 획득할 수 없다. 오직 레코드가INSERT
되는 시점에 아주 잠깐이 시간 동안 걸렸다가 해제 되기 때문에 대부분의 경우 문제를 일으키지 않았다.MySQL 5.1 이상
MySQL 5.1 이상
부터는innodb_autonic_lock_mode
라는 시스템 변수를 통해 auto increment lock의 작동 방식을 변경할 수 있다.innodb_autonic_lock_mode=0
: MySQL 5.0과 동일한 잠금 방식을 제공한다. 모든 INSERT 문장은 auto increment lock을 사용한다.innodb_autonic_lock_mode=1 (Consecutive mode)
: 단순히 한 건 또는 여러 건의 레코드를 INSERT하는 SQL 중에 MySQL 서버가 레코드 건수를 정확히 예측하는 경우에는 auto increment lock을 사용하지 않는다. 대신 훨씬 가볍고 빠른래치(뮤텍스)
를 이용해 처리한다.innodb_autonic_lock_mode=2 (Interleaved mode)
: 절대 auto increment lock을 사용하지 않고 경량화된래치(뮤텍스)
를 사용한다. 특징으로는 연속된 자동 증가 값을 보장하지 않는다.관련 페이지
169 ~ 170p