..

[DB] 트랜잭션 격리 수준(Isolation Level) 이해하기

1. 트랜잭션 격리 수준이란?

트랜잭션 격리 수준(Isolation Level)은 여러 트랜잭션이 동시에 실행될 때, 한 트랜잭션이 다른 트랜잭션의 변경 사항을 어느 정도까지 볼 수 있도록 허용할지 정의하는 기준입니다.

2. 왜 필요한가? (동시성 문제)

격리 수준이 낮을수록 성능은 좋아지지만, 다음과 같은 데이터 부정합(Anomaly) 현상이 발생할 수 있습니다.

  • Dirty Read: 커밋되지 않은 다른 트랜잭션의 데이터를 읽음. (나중에 롤백되면 엉뚱한 데이터를 본 셈)
  • Non-Repeatable Read: 한 트랜잭션 내에서 같은 조회를 두 번 했는데, 중간에 다른 트랜잭션이 값을 수정해버려 결과가 달라짐.
  • Phantom Read: 한 트랜잭션 내에서 같은 범위 조회를 두 번 했는데, 중간에 다른 트랜잭션이 데이터를 삽입/삭제하여 결과의 ‘개수’가 달라짐.

3. 격리 수준의 4단계

격리 수준 Dirty Read 방지 Non-Repeatable Read 방지 Phantom Read 방지
READ UNCOMMITTED X X X
READ COMMITTED O X X
REPEATABLE READ O O X
SERIALIZABLE O O O
  1. READ UNCOMMITTED: 가장 낮은 단계. 커밋되지 않은 데이터도 읽음. 권장하지 않음.
  2. READ COMMITTED: 커밋된 데이터만 읽음. 오라클 등 많은 DB의 기본 설정.
  3. REPEATABLE READ: 자신의 트랜잭션이 시작된 시점의 데이터를 보장함. MySQL InnoDB의 기본 설정.
  4. SERIALIZABLE: 가장 엄격한 단계. 트랜잭션을 순차적으로 실행하는 듯한 효과를 주어 모든 부정합을 방지하지만 성능이 매우 떨어짐.

일반적인 서비스라면 READ COMMITTEDREPEATABLE READ 수준에서 타협하는 것이 성능과 정합성 사이의 최적의 선택입니다.