InoDB 잠금 (2) record lock, gap lock, Next Key Lock, Insert Intention Lock, Auto Inc Lock
이전 포스팅에 이어서, 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