🔍 문제
PostgreSQL은 데이터베이스에서 어떤 방식으로 동시성을 제어하는가?
✅ 답안
1. 개념
**MVCC (Multi-Version Concurrency Control)**는
트랜잭션 간 **동시성(Concurrency)**을 보장하면서도, **락(Lock)**으로 인한 병목 없이 읽기/쓰기 충돌을 최소화하기 위한 기술입니다.
PostgreSQL은 모든 트랜잭션에서 **데이터의 Snapshot(스냅샷)**을 읽고, 변경 시 새로운 버전을 생성합니다.
2. 역할 & 목적
| 역할 | 설명 |
|---|
| 동시성 제어 | 여러 사용자가 동시에 데이터에 접근해도 일관성을 유지 |
| 읽기/쓰기 충돌 최소화 | 읽기 작업은 락 없이 처리, 쓰기는 버전 생성으로 해결 |
| 성능 향상 | 락 경합 감소, 병렬 처리 향상 |
3. 구조
- PostgreSQL의 MVCC는 **테이블의 튜플(Tuple)**마다 버전 정보를 저장
- 내부적으로 xmin, xmax 컬럼으로 버전 관리
| 필드 | 설명 |
|---|
| xmin | 해당 튜플을 만든 트랜잭션 ID |
| xmax | 해당 튜플을 삭제한(또는 무효화한) 트랜잭션 ID |
4. 동작 원리
- 트랜잭션이 시작되면 스냅샷(Snapshot) 생성
- SELECT: 현재 트랜잭션이 볼 수 있는 버전만 읽음
- UPDATE/DELETE: 기존 튜플을 무효화 (
xmax 설정), 새로운 버전 튜플을 삽입 (새로운 xmin)
- VACUUM: 더 이상 사용되지 않는 오래된 튜플을 물리적으로 삭제
5. 특징
| 항목 | 설명 |
|---|
| Non-blocking Read | SELECT는 락 없이 실행 가능 |
| 버전 기반 쓰기 | 충돌 시에도 새로운 버전 생성으로 처리 |
| VACUUM 필요 | 오래된 튜플이 쌓이므로 주기적 정리가 필요 |
6. 장단점
| 장점 | 단점 |
|---|
| 동시성 우수 | VACUUM 작업 필요 |
| 락 경합 감소 | 저장 공간 증가 가능 |
| 일관된 읽기 | 튜플 관리 복잡도 증가 |
7. 핵심 용어 정리
| 용어 | 설명 |
|---|
| Tuple | PostgreSQL의 한 레코드(행) |
| xmin / xmax | 트랜잭션 ID로 각 버전의 생성/종료를 관리 |
| Snapshot | 트랜잭션 시작 시점의 데이터 상태 복사본 |
| VACUUM | 불필요한 버전 정리 작업 |
| Visibility | 현재 트랜잭션에서 특정 튜플이 보여지는지 여부 |
8. 비교 – 락 기반 방식과 MVCC
| 항목 | 락 기반 | MVCC |
|---|
| 읽기 시 락 | 필요 | 불필요 |
| 충돌 발생 시 | 대기 or 오류 | 버전 생성 |
| 성능 | 낮음 | 높음 |
| 구현 복잡도 | 낮음 | 높음 |
9. 어린이 버전 요약
PostgreSQL은 책을 복사해서 읽고 쓰는 방식이야.
누군가 글을 쓰고 있어도, 나는 그 전에 복사한 책을 계속 읽을 수 있어.
그리고 새로운 글이 있으면 복사해서 새로운 페이지에 쓰고 예전 것은 버려.
그걸 정리해주는 게 **청소기(VACUUM)**야.