MVCC는 여러 사용자가 동시에 데이터를 읽고 변경할 때 데이터의 여러 버전을 이용해 일관된 읽기를 제공하는 동시성 제어 방식이다. 읽는 요청이 아직 완료되지 않은 다른 요청의 중간 상태를 그대로 보지 않도록 한다. PostgreSQL에서는 데이터베이스 동시성 제어의 핵심을 이 방식으로 구현한다.
스냅샷으로 읽기
조회는 자신에게 보이는 시점의 데이터, 즉 스냅샷을 기준으로 값을 읽는다. 일반적인 읽기와 쓰기의 잠금 충돌을 줄일 수 있지만, 모든 종류의 잠금이나 대기가 사라지는 것은 아니다. 행을 잠그는 조회나 스키마 변경처럼 별도 동작도 존재한다. PostgreSQL MVCC 소개
동시 편집의 예
편집자 한 명이 문서 제목을 바꾸는 동안 독자가 목록을 조회한다고 가정하자. 독자는 편집 중인 불완전한 값을 보는 대신 자신의 조회에 보이는 확정된 버전을 읽는다. 이후 조회에 새 제목이 보이는 시점은 격리 수준과 실행 시점에 따라 달라진다.
이 원리는 문서 편집 이력 기능과는 구별된다. 데이터베이스가 동시성 제어를 위해 보관하는 내부 버전을 사용자가 언제든 복구할 수 있는 영구 이력으로 간주해서는 안 된다.
버전 유지의 비용
트랜잭션이 오래 열린 채 남아 있으면 오래된 버전을 계속 보존해야 하는 상황이 생길 수 있다. PostgreSQL은 불필요해진 행 버전을 정리하기 위해 VACUUM과 자동 정리 기능을 사용한다. 공식 정리 작업 설명
운영에서는 느린 쿼리뿐 아니라 종료되지 않은 트랜잭션, 정리 작업의 진행, 테이블 증가 추세를 함께 살펴야 한다. MVCC를 켜 두면 관리가 끝나는 것이 아니라, 읽기 일관성과 버전 유지 비용을 함께 다루는 구조다.