격리 수준이 필요한 이유
여러 트랜잭션이 동시에 같은 데이터에 접근하면 서로의 결과에 영향을 주는 이상현상(Dirty Read, Non-repeatable Read, Phantom Read)이 발생할 수 있습니다. 격리 수준은 이런 이상현상을 어디까지 허용할지 정하는 기준입니다.
4단계 격리 수준
- Read Uncommitted: 커밋되지 않은 변경사항까지 읽을 수 있음(Dirty Read 발생)
- Read Committed: 커밋된 데이터만 읽지만, 같은 트랜잭션 내에서도 재조회 시 값이 달라질 수 있음
- Repeatable Read: 트랜잭션 동안 동일한 행은 항상 같은 값을 보장(단, Phantom Read는 DB마다 처리가 다름)
- Serializable: 트랜잭션들을 순차 실행한 것과 동일한 결과를 보장하는 가장 엄격한 수준
실무 선택 기준
격리 수준이 높을수록 데이터 일관성은 강해지지만 동시성(성능)은 떨어집니다. PostgreSQL은 기본값이 Read Committed이며, 대부분의 웹 서비스는 이 기본값으로 충분합니다. 정산·재고 차감처럼 정합성이 절대적으로 중요한 로직에서만 Serializable이나 명시적 락을 고려하는 것이 일반적입니다.