..
[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 |
- READ UNCOMMITTED: 가장 낮은 단계. 커밋되지 않은 데이터도 읽음. 권장하지 않음.
- READ COMMITTED: 커밋된 데이터만 읽음. 오라클 등 많은 DB의 기본 설정.
- REPEATABLE READ: 자신의 트랜잭션이 시작된 시점의 데이터를 보장함. MySQL InnoDB의 기본 설정.
- SERIALIZABLE: 가장 엄격한 단계. 트랜잭션을 순차적으로 실행하는 듯한 효과를 주어 모든 부정합을 방지하지만 성능이 매우 떨어짐.
일반적인 서비스라면 READ COMMITTED나 REPEATABLE READ 수준에서 타협하는 것이 성능과 정합성 사이의 최적의 선택입니다.