스프링 부트 트랜잭션 격리수준 정리

박성현·2026년 2월 27일

개발중 학습

목록 보기
42/44

📌 스프링 부트 트랜잭션 격리수준 한 번에 정리

트랜잭션 격리수준(Isolation Level)은
동시에 실행되는 트랜잭션 간 데이터 충돌을 어떻게 제어할지 정하는 기준입니다.

스프링 부트에서는 @Transactional로 설정하지만,
실제 동작은 DB가 결정합니다.


1️⃣ 먼저 알아야 할 3가지 문제

① Dirty Read

👉 커밋되지 않은 데이터를 읽는 문제

② Non-Repeatable Read

👉 같은 데이터를 두 번 조회했는데 값이 달라지는 문제

③ Phantom Read

👉 같은 조건으로 조회했는데 행(row) 개수가 달라지는 문제


2️⃣ 격리수준 4단계 핵심 비교

1. READ UNCOMMITTED

  • Dirty Read 허용
  • 정합성 낮음
  • 거의 사용하지 않음

2. READ COMMITTED ⭐ (실무 기본값)

  • Dirty Read 방지

  • Non-Repeatable / Phantom 발생 가능

  • 대부분 DB 기본값

    • Oracle Corporation
    • PostgreSQL Global Development Group

👉 일반적인 웹 서비스 표준


3. REPEATABLE READ

  • Dirty Read 방지
  • Non-Repeatable Read 방지
  • Phantom Read는 이론상 가능
  • MySQL (InnoDB) 기본값

👉 재고/포인트/정산 로직에서 고려


4. SERIALIZABLE

  • 모든 문제 방지
  • 가장 안전
  • 성능 저하 큼 (동시성 낮음)

👉 금융/결제 시스템


3️⃣ 한눈에 보는 표

LevelDirtyNon-RepeatablePhantom동시성
READ UNCOMMITTEDOOO높음
READ COMMITTEDXOO보통
REPEATABLE READXXO낮음
SERIALIZABLEXXX매우 낮음

4️⃣ 스프링 부트 설정 방법

@Transactional(isolation = Isolation.READ_COMMITTED)
public void logic() {
}

옵션:

Isolation.READ_UNCOMMITTED
Isolation.READ_COMMITTED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
Isolation.DEFAULT

DEFAULT는 DB 기본 격리수준 사용


5️⃣ 실무 정리

  • ✔ 대부분 서비스 → READ_COMMITTED
  • ✔ 데이터 정합성 중요 → REPEATABLE_READ 이상 고려
  • ✔ 무조건 높다고 좋은 건 아님 (성능 저하 발생)
  • ✔ JPA를 사용해도 결국 DB 격리수준 영향 받음

📌 한 줄 정리

격리수준은 “정합성 vs 성능”의 트레이드오프다.
실무에서는 READ_COMMITTED가 표준이다.


profile
개발기록장

0개의 댓글