트랜잭션 격리 수준 정리

최용혁·2025년 12월 9일

트랜잭션 격리 수준 정리

들어가며

스파르타 강의에서 트랜잭션 격리 수준을 배웠다. 처음엔 어렵게 느껴졌는데 정리하다보니 이해가 됐다.

격리 수준이란?

여러 트랜잭션이 동시에 실행될 때 서로 얼마나 격리시킬 것인가를 결정하는 수준이다.

트레이드오프:

  • 격리 수준 높음 → 정합성 ↑, 성능 ↓
  • 격리 수준 낮음 → 성능 ↑, 정합성 ↓

Level 0: Read Uncommitted

특징

커밋되지 않은 데이터도 읽을 수 있다.

발생 문제

  • Dirty Read: 발생
  • Non-Repeatable Read: 발생
  • Phantom Read: 발생

장단점

장점:

  • 잠금이 거의 없어서 성능이 가장 좋다

단점:

  • 데이터 정합성에 심각한 문제가 생긴다
  • 실무에서 거의 사용하지 않는다

Level 1: Read Committed

특징

커밋된 데이터만 읽을 수 있다. 대부분의 DB 기본값이다.

동작 방식

  1. 데이터를 읽을 때 공유 잠금(Shared Lock)을 건다
  2. 읽기가 끝나면 바로 잠금을 해제한다

발생 문제

  • Dirty Read: 방지
  • Non-Repeatable Read: 발생
  • Phantom Read: 발생

Non-Repeatable Read 예시:

[트랜잭션 A]
ID=100 사용자의 나이 조회 → 25세

[트랜잭션 B]
ID=100 사용자의 나이를 26세로 수정하고 커밋

[트랜잭션 A]
ID=100 사용자의 나이 다시 조회 → 26세

→ 같은 트랜잭션 안에서 같은 데이터가 다르게 조회됨

장단점

장점:

  • Dirty Read를 방지하면서도 적절한 성능을 보장한다

사용처:

  • Oracle, PostgreSQL, SQL Server의 기본 격리 수준

Level 2: Repeatable Read

특징

트랜잭션이 끝날 때까지 읽은 데이터를 다른 트랜잭션이 수정하거나 삭제할 수 없다.

동작 방식

  1. 데이터를 읽으면 잠금을 건다
  2. 트랜잭션이 끝날 때까지 잠금을 유지한다

발생 문제

  • Dirty Read: 방지
  • Non-Repeatable Read: 방지
  • Phantom Read: 발생

Phantom Read 예시:

[트랜잭션 A]
개발팀 소속 직원 조회 → 3명

[트랜잭션 B]
개발팀 소속 신규 직원 1명 추가(INSERT)하고 커밋

[트랜잭션 A]
개발팀 소속 직원 다시 조회 → 4명

→ 이전에 없던 데이터가 나타남

장단점

장점:

  • 데이터 일관성이 높다

사용처:

  • MySQL(InnoDB)의 기본 격리 수준

Level 3: Serializable

특징

가장 엄격한 격리 수준. 트랜잭션을 순서대로 하나씩 실행하는 것처럼 동작한다.

동작 방식

특정 범위의 데이터를 읽을 때 해당 범위 전체에 잠금을 걸어서 INSERT조차 막는다.

발생 문제

  • Dirty Read: 방지
  • Non-Repeatable Read: 방지
  • Phantom Read: 방지

장단점

장점:

  • 모든 동시성 문제를 완벽하게 방지한다

단점:

  • 동시 처리 성능이 크게 저하된다

사용처:

  • 데이터 정합성이 극도로 중요한 금융 시스템 일부
  • 매우 제한적으로 사용

비교표

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read주요 사용처
Read Uncommitted발생발생발생거의 안 씀
Read Committed방지발생발생대부분 DB 기본값
Repeatable Read방지방지발생MySQL 기본값
Serializable방지방지방지금융 시스템 일부

선택 가이드

대부분의 애플리케이션

Read Committed로 충분하다. Dirty Read를 막아주면서 좋은 성능을 보장한다.

데이터 일관성이 중요한 경우

하나의 트랜잭션 내에서 조회한 값이 변하지 않아야 한다면 Repeatable Read를 고려한다.

극도의 정합성이 요구되는 경우

동시성 저하를 감수하고서라도 데이터 불일치가 절대 발생하면 안 되는 시스템이라면 Serializable을 사용한다.


정리

트랜잭션 격리 수준은 데이터 정합성시스템 성능 사이의 트레이드오프 관계다.

4가지 레벨:

  • Level 0: Read Uncommitted (거의 안 씀)
  • Level 1: Read Committed (대부분 DB 기본값)
  • Level 2: Repeatable Read (MySQL 기본값)
  • Level 3: Serializable (특수한 경우만)

다음 단계

실습으로 각 문제 상황을 직접 재현해볼 예정이다.

  • Dirty Read 재현
  • Non-Repeatable Read 재현
  • Phantom Read 재현
profile
안녕하세용

0개의 댓글