이전 포스팅에 이어서, InnoDB Lock 중, "락이 적용되는 상황"에 따른 분류로 구분지은 잠금이다.

Record Lock

인덱스 레코드에 대한 잠금이다.

  - 만약 인덱스가 하나도 없으면 내부적으로 자동 생성된 클러스터 인덱스를 이용해 잠금을 설정한다.

  - PK나 Unique 인덱스에 의한 변경 및 조회는 갭락을 걸지 않고, 레코드 자체에서만 락을 건다.

Gap Lock

인덱스 레코드 사이의 간격에 대한 잠금이다. (첫번째 인덱스레코드는 그 이전, 마지막 인덱스레코드는 그 이후의 갭)

  - 레코드와 레코드 사이의 간격에 새로운 레코드가 INSERT 되는 것을 제어한다.

  - 동일한 gap에 대해 서로 다른 트랜잭션이 동시에 gap 락을 잡을 수 있다. (s락이든, x락이든 동일하게 갭에 INSERT 되는 것을 방지한다.)

  - 갭락은 개념일 뿐, 자체적으로 사용되지는 않고, 넥스트키락의 일부로 사용된다.

  - GAP락은 SELECT...FOR UPDATE 에만 영향을 미치지 않는다. (즉, 사이의 간격에 insert 할 수 있다.)

Next Key Lock

레코드락과 갭락을 합쳐놓은 형태로, 인덱스레코드와 해당 레코드 '이전'의 갭을 조합하여 잠근 것이다.

  ex) 인덱스에 5, 10, 15, 20 이 포함되어 있을 때, 아래와 같이 넥스트키락이 잡힌다. (둥근괄호는 끝점 제외, 대괄호는 끝점 포함)

( ~ , 5 ]

( 5 , 10 ]

( 10 , 15 ]

( 15 ,  20 ]

( 20 , ~ ]

 

Insert Intention Lock

동일한 인덱스 간격에 INSERT하려는 여러 트랜잭션이 gap 내의 동일한 위치에 INSERT하는게 아니라면, 서로를 기다릴 필요가 없도록 INSERT하려는 의도를 나타내는 것이다. (x락 잡기 전에)

  - 한 트랜잭션 A에서 SELECT FOR UPDATE 를 범위로 조회하고 있을 때, 그 범위에 해당되는 데이터를 INSERT하려는 다른 트랜잭션 B는 x락을 얻기위해 기다리는 동안 Insert Intention Lock 을 건다.

  ex) 인덱스에 4와 7이 있을 때, 5와 6의 값을 INSERT하려는 각각의 트랜잭션은, 동일한 위치에 INSERT하는 게 아니므로, 각각 INSERT된 행에서 x락을 얻기 전에, Insert Intention Lock으로 4와 7 사이의 gap을 잠근다.

Auto Inc Lock

Auto_Increment 컬럼을 가진 테이블에 동시에 여러 트랜잭션이 INSERT 하는 경우, 나중의 트랜잭션은 먼저 INSERT중인 트랜잭션에 의해 삽입된 연속적인 pk 값을 수신받기 위해 Auto Inc 잠금을 걸어 대기한다.

 

  * innodb_autoinc_lock_mode

> 0 (traditional mode) : Auto Increment 컬럼이 있는 테이블에 INSERT 하는 모든 문장에 테이블 수준의 Auto Inc 잠금을 얻는다.

    - INSERT 구문 실행시까지 락이 유지된다. (트랜잭션 끝날때까지가 아님)

> 1 (consecutive mode) : INSERT되는 레코드의 건수를 정확히 예측할 수 있을 때는, Auto Inc Lock을 걸지 않고, 훨씬 가볍고 빠른 뮤텍스를 이용해 처리한다. (뮤텍스는 아주 짧은 시간 동안만 잠금을 걸고 필요한 Auto Increment 값을 가져오면 즉시 잠금이 해제된다.)

    - INSERT...SELECT처럼 쿼리 실행전에는 건수를 예측할 수 없을 땐 Auto Inc 락을 사용하고, INSERT문장이 완료되기 전까지는 Auto Inc 락이 해제되지 않으므로, 다른 커넥션에서는 INSERT를 못하고 대기한다.

    - 최소한 하나의 INSERT 문장으로 INSERT되는 레코드는 연속된 자동증가 값을 가진다.

> 2 (interleaved mode) : Auto Inc Lock을 걸지 않고, 항상 뮤텍스를 이용한다.

    - 하나의 INSERT 문장으로 INSERT되는 레코드여도 연속된 자동증가값을 보장하지 않는다.

    - INSERT...SELECT 실행 중에 다른 커넥션에서도 INSERT를 수행할 수 있으므로 동시 처리 성능이 높으나, 유니크한 값이 생성된다는 것만 보장되며, Auto increment 값들에 gap이 존재할 수 있고, 복제를 사용하는 경우 Master와 Slave의 자동증가값이 달라질 가능성이 있다.

 

  ** Mutex(Mutual exclusive, 상호배제) : 한 개의 리소스에 대해 Lock/UnLock 매커니즘을 사용하는 기술 (ex. 한칸짜리 전용 열쇠 화장실)

  <-> Semaphore : 프로세스들이 여러개의 리소스에 접근할 수 있는 허용 가능한 카운터 수를 표현하는 기술 (ex. 여러칸 있는 화장실)

 

record lock, gap lock, Next Key Lock, Insert Intention Lock, Auto Inc Lock

 

https://www.letmecompile.com/mysql-innodb-auto-increment-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94/

'[MySQL 운영] > MySQL basic' 카테고리의 다른 글

InoDB 잠금 (1) S락, X락, IS락, IX락  (1) 2021.01.29
MySQL 잠금  (0) 2021.01.29
Transaction isolation level (트랜잭션 격리수준)  (0) 2021.01.29
InnoDB Storage Engine 특성 및 구조  (0) 2021.01.29
MySQL Replication 구조  (0) 2021.01.29
MySQL Query cache (~5.7)  (0) 2021.01.29
MySQL 스레딩 구조  (0) 2021.01.29
MySQL Architecture  (0) 2021.01.29
MySQL Memory (서버단위/세션단위)  (0) 2021.01.28
Print Friendly and PDF Posted by JJ*
: