POSTGRESQL MVCC

agnusdei·2025년 5월 31일

Database

목록 보기
75/76

🔍 문제

PostgreSQL은 데이터베이스에서 어떤 방식으로 동시성을 제어하는가?


✅ 답안

1. 개념

**MVCC (Multi-Version Concurrency Control)**는
트랜잭션 간 **동시성(Concurrency)**을 보장하면서도, **락(Lock)**으로 인한 병목 없이 읽기/쓰기 충돌을 최소화하기 위한 기술입니다.

PostgreSQL은 모든 트랜잭션에서 **데이터의 Snapshot(스냅샷)**을 읽고, 변경 시 새로운 버전을 생성합니다.


2. 역할 & 목적

역할설명
동시성 제어여러 사용자가 동시에 데이터에 접근해도 일관성을 유지
읽기/쓰기 충돌 최소화읽기 작업은 락 없이 처리, 쓰기는 버전 생성으로 해결
성능 향상락 경합 감소, 병렬 처리 향상

3. 구조

  • PostgreSQL의 MVCC는 **테이블의 튜플(Tuple)**마다 버전 정보를 저장
  • 내부적으로 xmin, xmax 컬럼으로 버전 관리
필드설명
xmin해당 튜플을 만든 트랜잭션 ID
xmax해당 튜플을 삭제한(또는 무효화한) 트랜잭션 ID

4. 동작 원리

  1. 트랜잭션이 시작되면 스냅샷(Snapshot) 생성
  2. SELECT: 현재 트랜잭션이 볼 수 있는 버전만 읽음
  3. UPDATE/DELETE: 기존 튜플을 무효화 (xmax 설정), 새로운 버전 튜플을 삽입 (새로운 xmin)
  4. VACUUM: 더 이상 사용되지 않는 오래된 튜플을 물리적으로 삭제

5. 특징

항목설명
Non-blocking ReadSELECT는 락 없이 실행 가능
버전 기반 쓰기충돌 시에도 새로운 버전 생성으로 처리
VACUUM 필요오래된 튜플이 쌓이므로 주기적 정리가 필요

6. 장단점

장점단점
동시성 우수VACUUM 작업 필요
락 경합 감소저장 공간 증가 가능
일관된 읽기튜플 관리 복잡도 증가

7. 핵심 용어 정리

용어설명
TuplePostgreSQL의 한 레코드(행)
xmin / xmax트랜잭션 ID로 각 버전의 생성/종료를 관리
Snapshot트랜잭션 시작 시점의 데이터 상태 복사본
VACUUM불필요한 버전 정리 작업
Visibility현재 트랜잭션에서 특정 튜플이 보여지는지 여부

8. 비교 – 락 기반 방식과 MVCC

항목락 기반MVCC
읽기 시 락필요불필요
충돌 발생 시대기 or 오류버전 생성
성능낮음높음
구현 복잡도낮음높음

9. 어린이 버전 요약

PostgreSQL은 책을 복사해서 읽고 쓰는 방식이야.
누군가 글을 쓰고 있어도, 나는 그 전에 복사한 책을 계속 읽을 수 있어.
그리고 새로운 글이 있으면 복사해서 새로운 페이지에 쓰고 예전 것은 버려.
그걸 정리해주는 게 **청소기(VACUUM)**야.


profile
DevSecOps Pentest🚩

0개의 댓글