트랜잭션 격리수준(Isolation Level)은
동시에 실행되는 트랜잭션 간 데이터 충돌을 어떻게 제어할지 정하는 기준입니다.
스프링 부트에서는 @Transactional로 설정하지만,
실제 동작은 DB가 결정합니다.
👉 커밋되지 않은 데이터를 읽는 문제
👉 같은 데이터를 두 번 조회했는데 값이 달라지는 문제
👉 같은 조건으로 조회했는데 행(row) 개수가 달라지는 문제
Dirty Read 방지
Non-Repeatable / Phantom 발생 가능
대부분 DB 기본값
👉 일반적인 웹 서비스 표준
👉 재고/포인트/정산 로직에서 고려
👉 금융/결제 시스템
| Level | Dirty | Non-Repeatable | Phantom | 동시성 |
|---|---|---|---|---|
| READ UNCOMMITTED | O | O | O | 높음 |
| READ COMMITTED | X | O | O | 보통 |
| REPEATABLE READ | X | X | O | 낮음 |
| SERIALIZABLE | X | X | X | 매우 낮음 |
@Transactional(isolation = Isolation.READ_COMMITTED)
public void logic() {
}
옵션:
Isolation.READ_UNCOMMITTED
Isolation.READ_COMMITTED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
Isolation.DEFAULT
DEFAULT는 DB 기본 격리수준 사용
격리수준은 “정합성 vs 성능”의 트레이드오프다.
실무에서는 READ_COMMITTED가 표준이다.