본문 바로가기
DB

Lock

by 백엔드 개발자 2025. 10. 7.

Update Lock(업데이트락)


  • x lock을 걸기전 데드락 방지를 위해 사용되는 lock.
  • slock과는 호환 가능하나, ulock끼리는 호환 불가능해서 blocking함.
  • conversion deadlock에 대한 대처방법

 

conversion deadlock

  • 동일 레코드에 대해 서로다른 트랜잭션이 조회 및 변경을 하려는 경우 생기는 데드락.
  • update lock을 통한 conversion deadlock 해결

 


Record Lock


SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;
  • 인덱스 레코드에 대한 잠금
  • 특정행에 대해 삽입/수정/삭제를 막는다.

GAP LOCK


  • 인덱스레코드 사이 간격 또는 첫번째 레코드 이전/ 마지막 레코드 이후의 간격을 잠그는 것
  • 인덱스 사이의 빈공간에 락을 걸어서 새로운 데이터가 insert 안되게 하는 것.
  • SELECT c1 FROM t WHERE c1 BETWEEN 10 AND 20 FOR UPDATE;
    • 10~ 20 사이 모든 간격이 다 잠김. 그래서 c1 15 같은 값 삽입 불가
  • 동시성관 성능간의 트레이드 오프이고, 특정 격리 수준에서만 사용됨.
  • 유니크 인덱스로 정확히 1개의 행만 찾는경우 사용안함
  • gap lock 끼리는 충돌하지 않음. 오로지 목적이 insert 방지이므로
  • read committed에서는 갭잡금 비활성.

 

Q 정확히 언제 어떻게 걸리는 것일까

  • locking reads 옵션, update, delete
  • dml + 서브쿼리
  • secondary index,
  • 범위 검색,
  • pk, uk를 사용하나 해당 키에 맞는 값이 없는 행이 조건일 경우

 


NEXT KEY LOCK

  • record + gap lock
  • 인덱스 레코드 뿐만 아니라 그앞의 gap까지 같이 잠그는 방식
  • repeatable read 수준에서 기본사용하여 팬텀리드방지
  • 인덱스가 10, 11, 13, 20일 경우
    • (-∞, 10]
      (10, 11]
      (11, 13]
      (13, 20]
      (20, +∞)
    • 레코드 이전의 gap까지 포함해서 잠금

 

 

 

 

HOLDLOCK

SQL server의 힌트.

조건 범위에 공유잠금을 거는 방식

serializable과 동일한 수준으로 취급됨. 그래서 그 쿼리에서는 격리수준이 일시적인 serializable인 느낌

사용시 읽은행 및 행들사이 존재가능한 키범위에도 key-range lock을 걸어버림으로서 insert를 차단.

holdlock은 트랜잭션 종료시점까지 lock을 유지하므로, 트랜잭션 수준의 일관성을 제공가능

 

 

 

FOR SHARE

읽은 행에 공유잠금을 걸어버리는 메커니즘

다른 트랜잭션의 수정및 삭제만 막고 insert는 허용

 

 

FOR UPDATE

MySQL에서 읽은 행에 대해 X LOCK을 설정하는 메커니즘

where 조건으로 인덱스기반의 범위를 지정할 경우 where 조건에 실제 일치하는 행에 record lock을 걸어 update와 delete를 차단하고, gap lock으로 where 조건이 포함되는 키 값 범위 인덱스 간격에 insert를 막아버려 PR까지 막을 수 있음.

MySQL의 기본 격리수준repeatable read에서는 select만 사용해도 gaplock이 사용되 알아서 PR방지됨

 

 

검증 필요.

격리 수준 쿼리 유형 잠금 메커니즘 잠금 대상 (범위) INSERT 차단 (팬텀 방지) 다른 트랜잭션의 읽기 허용 여부
REPEATABLE READ 일반 SELECT MVCC (Consistent Read) 트랜잭션 시작 시점의 데이터 스냅샷 🚫 차단 안함 (잠금 없음) ✅ 허용
  FOR UPDATE 배타적 Next-Key Lock (X-Lock + Gap Lock) 읽은 행 및 그 사이의 간격 ✅ 차단됨 🚫 차단
  FOR SHARE 공유 Next-Key Lock (S-Lock + Gap Lock) 읽은 행 및 그 사이의 간격 ✅ 차단됨 ✅ 허용
--- --- --- --- --- ---
SERIALIZABLE 일반 SELECT 암시적 FOR SHARE (Next-Key Lock)* 읽은 행 및 그 사이의 간격 ✅ 차단됨 ✅ 허용
  FOR UPDATE 배타적 Next-Key Lock (X-Lock + Gap Lock) 읽은 행 및 그 사이의 간격 ✅ 차단됨 🚫 차단
  FOR SHARE 공유 Next-Key Lock (S-Lock + Gap Lock) 읽은 행 및 그 사이의 간격 ✅ 차단됨 ✅ 허용

 

 

 

 

https://velog.io/@koo8624/Database-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%9D%BDLock%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EC%97%AD%ED%95%A0

 

[Database] 데이터베이스 락(Lock)의 종류와 역할

데이터베이스는 여러 사용자들이 같은 데이터를 동시에 접근하는 상황에서, 데이터의 무결성과 일관성을 지키기 위해 락을 사용합니다. 데이터베이스의 락은 크게 3종류로 분류할 수 있습니다.

velog.io

https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html?utm_source=chatgpt.com

 

MySQL :: MySQL 8.4 Reference Manual :: 17.7.1 InnoDB Locking

This section describes lock types used by InnoDB. Shared and Exclusive Locks InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks and exclusive (X) locks. If transaction T1 holds a shared (S) lock on row r, then

dev.mysql.com

https://gisungcu.tistory.com/645

 

Lock에 대해 알아보기: Gap Lock

0. 들어가며 안녕하세요. 오늘은 Gap Lock에 대해 알아보려고 합니다.Gap Lock에 관심을 갖게 된 이유는 재고 관련 Locking을 공부하다가 궁금한 점이 생겼기 때문입니다. 재고 정합성을 위해 SELECT FOR UP

gisungcu.tistory.com

 

'DB' 카테고리의 다른 글

트랜잭션 동시성 제어  (0) 2025.10.08
직렬화이상  (0) 2025.10.08
트랜잭션 수준 일관성  (0) 2025.10.06
문장수준 쓰기 일관성  (1) 2025.10.05
문장 수준 읽기 일관성 동시성  (0) 2025.10.05