Mysql Lock
포스트
취소

Mysql Lock

Mysql Lock

mysql 에서 사용하는 락은 스토리지 엔진 레벨Mysql 엔진 레벨로 나눌 수 있다.

  • 스토리지 엔진 레벨 : 모든 스토리지엔진에 영향을 미침
  • Mysql 엔진 레벨 : 스토리지 엔진간 상호 영향을 미치지 않는다.

락 적용 요소에 따른 분류

  • Shared Locks (S)
  • Exclusive Locks (X)
  • Intention Locks

    락이 적용되는 상황에 따른 분류

  • Row Locks
  • Record Locks
  • Gap Locks
  • Next-key Locks
  • insert Intentation Locks
  • AUTO-INC Locks

공유 락 (Shared Locks)

1
SELECT ... LOCK IN SHARE MODE (8.0부터는 FOR SHARE 가능)
  • 읽기 잠금이라고도 불린다.
  • 어떤 자원에 shared lock이 동시에 여러개 적용될 수 있다.

배타 락( Exclusive Lock)

1
SELECT ... FOR UPDATE
  • 쓰기 잠금이라고도 불린다.
  • 데이터에 대해 베타 락을 획득한 트랜잭션은, 읽기 연산과 쓰기 연산을 모두 실행할 수 있다.
  • 베타 락이 걸려 있다면 다른 트랜잭션은 공유 락, 베타 락 둘 다 획득 할 수 없다.

의도 잠금 ( Intention Lock)

  • Table Level Lock
  • 해당 테이블 Row중 나중에 row-level lock 이 걸릴 것이라는 걸 미리 알려주기 위해 사용된다.

Row Lock

  • 테이블 row에 걸리는 Lock을 의미한다.
  • 각 row에 S-Lcok,X-Lock을 사용할 수 있다.

Record Lock

  • Primary key, unique index로 조회해서 하나의 레코드에만 lock을 거는 것을 의미한다.
  • 각 index record에 S-lock, X-lock을 사용 가능.

Gap Locks

  • 레코드가 아닌 레코드와 레코드 사이의 간격을 잠금
  • 지정된 범위에 해당하는 인덱스 테이블 공간을 대상으로 거는 잠금

Next key Locks

  • Next Key Lock이란 레코드 락과 갭 락을 합친 잠금으로, 앞서 살펴본 갭 락은 단독으로 사용되기 보다는 넥스트 키 락의 일부로 함께 사용된다.
  • Record Lock, Gap lock 이 복합적으로 발생하는 Lock 이다.

Insert Intention Lock

insert intention lock 은 행 삽입에 앞서 INSERT 수행에 의해 만들어지는 갭 잠금의 한 종류입니다. 이 잠금은 삽입 의도를 나타냅니다. 여러 트랜잭션이 갭 내에서 같은 위치에 값을 삽입하는 것이 아니라면, 같은 인덱스 갭에 삽입하더라도 다른 트랜잭션의 작업이 끝나길 기다리지 않아도 되는 것을 의미합니다. 인덱스 4와 7이 있다고 했을 때, 5와 6에 값을 추가하려는 서로 다른 트랜잭션은 exclusive lock 을 획득하기 전에 insert intention lock 으로 4와 7 사이의 갭을 잠급니다. 그러나 삽입하고나 하는 행에서 충돌이 발생하지 않기 때문에 서로 블록하지 않습니다.

AUTO-INC Locks

Mysql은 자동 증가하는 숫자값을 채번하기 위해 AUTO_INCREMENT라는 컬럼 속성을 제공하며, 이는 주로 대체키에 사용된다. AUTO_INCREMENT 컬럼은 여러 레코드가 동시에 INSERT 되더라도 중복되지 않고 순차적으로 증가하는 일련번호를 제공하기 위해 내부적으로 테이블 수준의 잠금인 자동 증가 락(Auto Increment Lock)을 사용한다. INSERT와 REPLACE와 같이 새로운 레코드를 저장하는 쿼리에서만 사용된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.