🎯 개요
이 글은 이전에 정리한
👉 [데이터베이스] 트랜잭션 격리 수준과 직접적으로 연결됩니다.
앞에서는 격리 수준이
어떤 현상을 막아주는지 중심으로 설명했다면,
이번에는 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은 실무에서 매우 자주 등장하므로 반드시 숙지해야 합니다.
'컴퓨터 과학 > 데이터베이스' 카테고리의 다른 글
| 💻 [데이터베이스] 실무에서 직접 느낀 쿼리 튜닝 팁 정리 (0) | 2025.05.10 |
|---|---|
| 💻 [데이터베이스] ORM과 JPA 제대로 이해하기 (0) | 2025.05.09 |
| 💻 [데이터베이스] 인덱스 원리와 동작 구조 정리 (0) | 2025.05.09 |
| 💻 [데이터베이스] 정규화 vs 비정규화 차이 정리 (0) | 2025.05.09 |
| 💻 [데이터베이스] 트랜잭션 격리 수준 (Isolation Level) (0) | 2025.04.29 |