MVCC(다중 버전 동시성 제어) 개요

MVCC(다중 버전 동시성 제어) 개요

여러 사용자가 동시에 같은 데이터를 읽고 쓰는 상황에서, PostgreSQL이 어떻게 데이터의 일관성을 지켜주는지 궁금하셨죠? 그 해답이 바로 MVCC, 즉 다중 버전 동시성 제어(Multiversion Concurrency Control)예요. 이 모델 덕분에 읽기와 쓰기가 서로를 막지 않는 편안한 동시성 환경을 만들 수 있어요.

출처: 공식문서

동시성, 그리고 스냅샷이라는 개념

PostgreSQL은 개발자가 데이터에 대한 동시 접근을 관리할 수 있도록 풍부한 도구를 제공해요. 내부적으로는 다중 버전 모델, 즉 MVCC로 데이터 일관성을 유지하는데요. 여기서 핵심은 각 SQL 문이 "어떤 시점의 데이터 스냅샷(데이터베이스 버전)"을 본다는 거예요. 지금 이 순간의 기저 데이터 상태가 어떻든, 그 스냅샷을 기준으로 응답하죠. 덕분에, 같은 행을 수정하는 동시 트랜잭션들이 만들어내는 불일치한 데이터를 각 SQL 문이 보지 않게 되어, 세션마다 트랜잭션 격리가 보장돼요.

전통적인 DBMS가 잠금(locking)으로 이를 해결했다면, MVCC는 잠금 경합(lock contention)을 줄여 다중 사용자 환경에서도 합리적인 성능을 유지하도록 해줘요.

읽기는 쓰기를, 쓰기는 읽기를 막지 않아요

MVCC 모델의 가장 큰 장점은 명확해요. MVCC에서는 읽기(쿼리)를 위해 얻는 잠금과 쓰기를 위해 얻는 잠금이 서로 충돌하지 않아서, 읽기가 쓰기를, 쓰기가 읽기를 절대 막지 않아요. 게다가 PostgreSQL은 혁신적인 직렬화 가능 스냅샷 격리(Serializable Snapshot Isolation, SSI) 수준을 사용해, 가장 엄격한 트랜잭션 격리를 제공하면서도 이 보장을 끝까지 지켜요.

잠금을 쓸 수도 있다, 하지만 MVCC가 낫다

물론 PostgreSQL에는 테이블·행 수준 잠금 기능도 있어요. 전체 트랜잭션 격리가 항상 필요하진 않고, 특정 충돌 지점만 명시적으로 관리하고 싶은 애플리케이션에는 이쪽이 더 적합할 때도 있죠. 다만 일반적으로는 MVCC를 제대로 사용하는 편이 잠금보다 더 좋은 성능을 내요.

거기에 더해, 애플리케이션이 정의하는 애드바이저리 잠금(advisory lock)도 있는데요. 이건 단일 트랜잭션에 묶이지 않는 잠금이라, 트랜잭션 범위 밖에서도 자원을 보호할 수 있는 유연한 도구예요.

더 알아보기 (Learn more)