InnoDB Lock

Choco·2024년 4월 29일
1
post-thumbnail

DB는 한 데이터가 동시적으로 여러 요청이 들어올때 데이터의 손상을 막기위해 Lock을 지원한다. Mysql InnoDB에서는 어떤 방식으로 Lock을 지원하는지 알아보자.

Lock 적용 요소

Shared Lock(S-Lock)

  • Read 동안 Lock (Write 불가능)
  • select ~ lock in share mode or select ~ for share
  • 한 row에 대해 여러 S-Lock을 걸 수 있다.

Exclusive Lock(X-Lock)

  • Write 동안 Lock (Read,Write 불가능)
  • 값 수정시에 동작한다
  • select ~ for update,update,delete..
  • X-Lock이 걸려있는 상태면 S-LOCK,X-Lock 둘다 걸 수 없다.

Lock 적용 상황

Record Lock

테이블 레코드에 락이 걸린다.
index를 기준으로 하여 index 없이 수정을 하려하면 테이블 모든 레코드에 락이 걸린다.

Person 테이블이 다음과 같다고 하자.

id이름나이
1김철수20
3김철시21

select * from Person where id=1 for update
Record Lock을 통해 id가 1인 레코드가 X-Lock에 걸리게 된다.

select * from Person where 나이>=20 for update
나이가 index로 되어있다고 가정했을때
Record Lock을 통해 나이가 20 이상인 레코드가 X-Lock에 걸리게 된다.

select * from Person where 이름="김철수" for update
이름이 index가 아니라고 했을때
Record Lock을 통해 모든 레코드가 X-Lock에 걸리게 된다.

Gap Lock

아직 생성 이전에 조건에 맞는 인덱스가 락에 걸린다.
주로 혼자 사용되지않고 Next Key Lock시 같이 사용됨.

Person 테이블이 다음과 같다고 하자.

id이름나이
1김철수20
3김철시21

select * from Person where id<=3 for update
id<=3에 해당되는 존재하지 않는(id=2)에 대해 Gap Lock이 걸려 id=2인 레코드를 생성할 수 없게된다

Next Key Lock

Record Lock + Gap Lock
범위 인덱스를 조건으로 걸때 사용된다.

profile
주니어 백엔드 개발자 입니다:)

0개의 댓글