InoDB 잠금 (2) record lock, gap lock, Next Key Lock, Insert Intention Lock, Auto Inc Lock
[MySQL 운영]/MySQL basic 2021. 1. 29. 15:22 |이전 포스팅에 이어서, 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
'[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 |