트랜잭션의 격리성 수준
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 | 발생 | 발생 |
| READ COMMITTED | - | 발생 | 발생 |
| REPEATABLE READ | - | - | 발생 (DB에 따라 다름) |
| SERIALIZABLE | - | - | - |
상세
- READ UNCOMMITTED (레벨 0)
가장 낮은 격리 수준으로, 커밋되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용한다.
- 특징: 데이터 일관성을 거의 보장하지 않음.
- 문제점: Dirty Read 발생. (트랜잭션 A가 수정 중인 데이터를 B가 읽었는데, A가 롤백할 경우 B는 무효한 데이터를 가진 꼴이 됨)
- READ COMMITTED (레벨 1)
가장 많이 사용되는 기본 격리 수준(Oracle, PostgreSQL 등)으로, 커밋 완료된 데이터만 조회할 수 있다.
- 특징: Dirty Read 방지.
- 문제점: Non-Repeatable Read 발생. (한 트랜잭션 내에서 같은 쿼리를 두 번 실행했을 때, 그 사이 다른 트랜잭션이 데이터를 수정/커밋하면 결과가 다르게 나타남)
- REPEATABLE READ (레벨 2)
한 트랜잭션 내에서 동일한 데이터를 반복해서 읽더라도 항상 동일한 결과를 보장한다. MySQL InnoDB의 기본 격리 수준이다.
- 특징: 트랜잭션이 시작된 시점의 Snapshot을 이용해 조회하므로 데이터의 일관성 유지.
- 문제점: Phantom Read 발생 가능. (다른 트랜잭션이 새로운 레코드를 삽입(Insert)할 경우, 이전에는 없던 레코드가 나타나는 현상)
- SERIALIZABLE (레벨 3)
가장 높은 격리 수준으로, 트랜잭션을 순차적으로 진행시킨다.
- 특징: 모든 읽기 작업에도 공유 잠금(Shared Lock)을 걸어 동시성을 극도로 제한함.
- 문제점: 성능 저하가 심해 실제 운영 환경에서는 거의 사용되지 않음.