컴퓨터 과학/데이터베이스

💻 [데이터베이스] 락(Lock)과 트랜잭션 격리 수준의 관계

프로그래민구찌 2025. 5. 9. 21:39

🎯 개요

이 글은 이전에 정리한
👉 [데이터베이스] 트랜잭션 격리 수준과 직접적으로 연결됩니다.

앞에서는 격리 수준이
어떤 현상을 막아주는지 중심으로 설명했다면,
이번에는 DB가 실제로 그 약속을 어떻게 지키는지 — 즉 “락”을 통해 구현하는 방식을 다루는 글입니다.


🧠 락(Lock)이란?

✅ 락은 DB에서 동시성 제어를 위해 사용하는 메커니즘입니다.

트랜잭션이 데이터를 읽거나 쓸 때,
다른 트랜잭션이 그 데이터에 접근하지 못하도록 막는 장치입니다.

→ 락을 통해 격리 수준(Isolation Level)의 효과가 실제로 구현됩니다.


📋 락의 종류 정리

✅ 기본 락

종류 설명 사용 목적
S-Lock (Shared Lock) 읽기 락: 여러 트랜잭션이 읽기 가능 SELECT
X-Lock (Exclusive Lock) 쓰기 락: 한 트랜잭션만 읽기/쓰기 가능 UPDATE, DELETE

✅ InnoDB의 세부 락

격리 수준 사용되는 락 전략 방지 가능한 현상
Read Uncommitted 락 없음 또한 최소한의 S-Lock Dirty Read X
Read Committed S-Lock은 짧게, X-Lock은 즉시 적용 Non-repeatable Read X
Repeatable Read Next-Key Lock 사용 Phantom Read X (MySQL InnoDB 기준)
Serializable 모든 트랜잭션을 직렬화, Range Lock 수준 모든 문제 X (성능 저하 심각)

✅ MySQL InnoDB에서는 Repeatable Read 기본값에서
Next-Key Lock으로 팬텀 리드까지 차단하고 있어 효과적으로 높은 정합성을 유지할 수 있습니다.


💥 데드락(Deadlock)이란?

두 개 이상의 트랜잭션이
서로가 점유하고 있는 락을 기다리며
무한 대기 상태에 빠지는 현상입니다.

✅ 예시

  • T1이 row A에 락을 걸고 → row B 락을 기다림
  • T2는 row B에 락을 걸고 → row A 락을 기다림
    → 서로 양보 없이 기다리다 데드락 발생

✅ 해결 전략

  • 락 대기 시간 제한 (innodb_lock_wait_timeout)
  • 락 순서 일관성 유지
  • 단일 트랜잭션 내 가능한 모든 SELECT/UPDATE 처리

🛠 실무 예시 및 주의할 점

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void updateStock() {
    Product p = productRepository.findById(1L); // Next-Key Lock 발생
    p.decreaseStock(1);
}

 

📌 주의 사항

  • 인덱스가 없는 컬럼에 WHERE 조건이 걸리면 → 전체 테이블에 락이 걸릴 수 있음
  • WHERE 없이 SELECT FOR UPDATE → 전체 테이블 락

✅ 실무에서는
락 범위를 최소화하고, SELECT/UPDATE 순서를 명확히 하는 것이 핵심입니다.


✍️ 마무리 요약

  • 트랜잭션 격리 수준은 DB의 약속이고,
  • 은 그 약속을 실현하는 기술입니다.
  • 락을 이해하면 트랜잭션이 어떤 순간에 병목이 생기는지,
    어떻게 회피할 수 있는지까지 실무 감각이 생깁니다.
  • 특히 InnoDB의 Next-Key Lock은 실무에서 매우 자주 등장하므로 반드시 숙지해야 합니다.