Skip to content

post(blog): PostgreSQL의 트랜잭션 격리 수준 (#43) - #141

Merged
Malloc72P merged 1 commit into
mainfrom
claude/issue-43-transaction-isolation
Sep 3, 2026
Merged

post(blog): PostgreSQL의 트랜잭션 격리 수준 (#43)#141
Malloc72P merged 1 commit into
mainfrom
claude/issue-43-transaction-isolation

Conversation

@Malloc72P

Copy link
Copy Markdown
Owner

Closes #43

요약

PostgreSQL 18.4에서 psql 세션 두 개를 계속 열어 두고, 네 격리 수준이 각각 어떤 현상을 막고 어떤 현상을 허용하는지 직접 측정해 정리했습니다.

본문의 모든 수치와 출력은 실측이고, 동작 설명은 PostgreSQL 18 공식문서 13.2절과 소스 트리의 README-SSI 원문을 인용했습니다.

측정 결과

Dirty Read Non-repeatable Read Phantom Read Serialization Anomaly
READ UNCOMMITTED 없음 발생 발생 발생 (문서)
READ COMMITTED 없음 발생 발생 발생 (문서)
REPEATABLE READ 없음 없음 없음 발생
SERIALIZABLE 없음 없음 없음 없음
  • READ UNCOMMITTED는 PostgreSQL에 없습니다. SHOW transaction_isolation은 요청값을 그대로 돌려주지만, 같은 트랜잭션 안에서 재조회 결과가 바뀌는 것으로 READ COMMITTED 동작임을 확인했습니다.
  • REPEATABLE READ는 Phantom Read도 막습니다. SQL 표준은 이 수준에서 팬텀을 허용하지만, PostgreSQL은 첫 구문에서 뜬 스냅샷 하나로 INSERT·DELETE를 모두 차단합니다.
  • REPEATABLE READ와 SERIALIZABLE을 가르는 것은 Write Skew입니다. 두 세션이 같은 합계를 읽고 서로 다른 행을 고치면 REPEATABLE READ에서는 둘 다 커밋되어 업무 규칙이 깨지고, SERIALIZABLE에서는 나중 커밋이 취소됩니다.

다루는 내용

  • 행 버전 구조: 같은 시각 두 세션이 보는 ctid·xmin·xmax, pageinspect로 확인한 두 버전의 공존
  • 스냅샷 시점 차이: 구문마다(READ COMMITTED) vs 첫 구문에서 한 번(REPEATABLE READ)
  • 같은 행 동시 갱신: READ COMMITTED는 대기 후 적용, REPEATABLE READ는 could not serialize access due to concurrent update
  • SERIALIZABLE의 검사 규칙: 읽기가 남기는 SIREAD(pg_locks 실측), 쓰기가 만드는 rw-conflict 간선, 간선 두 개가 한 트랜잭션을 관통할 때의 취소
  • 취소 시점이 상대의 커밋이 아니라 내 쓰기·커밋이라는 것, 한 방향 간선만 있으면 통과한다는 것
  • seq scan이 테이블 전체에 predicate lock을 남겨 취소가 늘어나는 문제

검증

  • pnpm --filter blog build 통과 (137 페이지)
  • 검색 인덱스 description 정상 (36개 포스트 중 빈 값 0개)
  • dev 서버 200, H2 10개 · H3 13개 · 표 3개 · 코드 블록 25개 · 인용 14개 렌더 확인

- PostgreSQL 18.4에서 psql 세션 두 개로 네 격리 수준의 실제 동작을 측정해 정리
- READ UNCOMMITTED 부재, REPEATABLE READ의 팬텀 차단, Write Skew를 실측 출력과 공식문서 인용으로 서술
- SERIALIZABLE의 SIREAD·rw-conflict·pivot 검사 규칙을 pg_locks 실측과 README-SSI로 설명
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
blog Ignored Ignored Sep 3, 2026 7:00am UTC

@Malloc72P
Malloc72P merged commit 8875bc0 into main Sep 3, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

트랜잭션 격리 수준과 락: Dirty Read부터 SERIALIZABLE까지

1 participant