MVCC 아키텍처의 핵심 원리
MVCC는 데이터 업데이트 시 기존 데이터를 덮어쓰지 않고 새로운 버전을 생성합니다. 각 행(튜플)은 transaction ID(XID) 기반으로 다중 버전을 유지하며, 읽기 연산은 스냅샷 격리를 통해 시작 시점의 일관된 데이터 상태를 봅니다. 쓰기 연산이 새 버전을 생성해도 기존 버전은 메모리에 남아 있어, 다른 트랜잭션의 읽기를 방해하지 않습니다.
버전 저장 및 가시성 판단
각 데이터 버전은 생성한 XID(xmin)와 삭제한 XID(xmax)를 메타데이터로 기록합니다. 트랜잭션이 행에 접근할 때 스냅샷의 타임스탐프와 xmin/xmax를 비교하여 해당 트랜잭션이 볼 수 있는 버전을 결정합니다. 이 방식으로 락 없이도 일관성을 보장하며, Read Committed와 Repeatable Read, Serializable 같은 격리 수준에 따라 스냅샷 타이밍을 조정합니다.
실무에서의 주의사항
MVCC 기반 데이터베이스는 시간이 지남에 따라 불필요한 구 버전(dead tuple)이 쌓여 성능 저하를 초래합니다. PostgreSQL의 VACUUM 프로세스가 주기적으로 미사용 버전을 제거해야 하며, 고쓰기 워크로드에서는 VACUUM 튜닝이 필수입니다. 또한 인덱스가 모든 버전의 행을 추적해야 하므로 인덱스 크기 증가와 쿼리 성능 영향도 모니터링해야 합니다.