트랜잭션 격리 수준은 동시에 실행되는 작업 사이에서 어떤 변경을 볼 수 있고 어떤 이상 현상을 막을지 정하는 규칙이다. 같은 트랜잭션 안에서 같은 조회를 두 번 실행해도 항상 같은 결과가 나오는 것은 아니다. 데이터베이스 제품별 구현을 확인해야 한다.
PostgreSQL의 주요 수준
PostgreSQL에서는 Read Committed가 기본이며, 일반 조회는 각 문장이 시작할 때의 확정된 데이터를 본다. Repeatable Read는 더 안정적인 스냅샷을 제공한다. Serializable은 성공한 트랜잭션들의 결과가 어떤 순서의 순차 실행과 같도록 보장하며, 충돌 때문에 재시도가 필요할 수 있다. 공식 격리 수준 설명
| 수준 | 이해할 핵심 |
|---|---|
| Read Committed | 연속한 두 조회 사이에 다른 커밋이 보일 수 있음 |
| Repeatable Read | 트랜잭션 안에서 스냅샷을 일관되게 유지 |
| Serializable | 직렬 실행과 동등한 결과를 목표로 충돌 감지 |
좌석 예약의 예
남은 좌석이 하나인지 조회한 뒤 예약을 생성하는 요청이 동시에 두 개 실행된다고 가정하자. 각 요청이 빈 좌석을 봤다는 사실만으로 예약 성공을 모두 허용하면 업무 규칙이 깨질 수 있다. 격리 수준뿐 아니라 고유 제약, 조건부 변경, 잠금 또는 재시도 설계를 함께 검토해야 한다.
이름만으로 판단하지 않기
PostgreSQL의 Read Uncommitted는 Read Committed처럼 동작한다. Repeatable Read가 막는 현상도 표준의 최소 요구보다 강할 수 있다. 따라서 다른 제품에서 익힌 이름만으로 동작을 단정하면 안 된다.
가장 높은 수준을 선택하는 것만으로 애플리케이션이 완성되지는 않는다. 재시도 가능한 오류를 구분하고 동일 요청을 반복해도 중복 결제가 생기지 않도록 업무를 구성해야 한다. 격리의 배경을 이해하려면 MVCC도 함께 살펴볼 수 있다. PostgreSQL 동시성 제어