컴퓨터 과학/데이터베이스
💻 [데이터베이스] 락(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은 실무에서 매우 자주 등장하므로 반드시 숙지해야 합니다.