한양과학기술고등학교

에듀테크 프로젝트 대시보드

격리 수준

Read Committed Repeatable Read Serializable 40001 재시도

동시에 도는 트랜잭션이 서로를 얼마나 볼 수 있는지. PostgreSQL 기본은 Read Committed.

1. 세 수준과 이상 현상

수준Dirty ReadNon-repeatablePhantom직렬화 이상
Read Committed (기본)없음가능가능가능
Repeatable Read없음없음없음*가능
Serializable없음없음없음없음

* PostgreSQL 의 Repeatable Read 는 표준보다 강해서 팬텀도 막습니다(스냅샷 격리).

2. Read Committed 동작

각 문장이 시작될 때의 스냅샷을 봅니다. 같은 트랜잭션 안에서도 SELECT 를 두 번 하면 그 사이 커밋된 변경이 보일 수 있습니다.

-- 갱신 시 다른 트랜잭션이 먼저 커밋했으면, 그 최신 행 기준으로 재평가됨
UPDATE accounts SET balance = balance - 100 WHERE id = 1;   -- 안전한 증감

3. Repeatable Read / Serializable

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  -- 트랜잭션 시작 시점 스냅샷 고정. 리포트·정합성 필요한 다중 SELECT 에 좋음
COMMIT;

BEGIN ISOLATION LEVEL SERIALIZABLE;
  -- 동시 실행 결과가 '순차 실행 중 하나'와 같음을 보장
COMMIT;

4. 직렬화 실패는 재시도

SQLSTATE 40001 / 40P01
  • Repeatable Read·Serializable 에서 충돌 시 트랜잭션이 중단(40001) — 애플리케이션이 처음부터 다시 실행해야 함
  • 재시도 루프(2~3회, 지수 백오프)를 공용 유틸로 만들어 두기
for attempt in range(3):
    try:
        with conn.transaction():
            run_logic()
        break
    except SerializationError:
        if attempt == 2: raise
        time.sleep(0.05 * 2 ** attempt)
"EXPLAIN ANALYZE 없이 성능을 논하지 마라"