MVCC로 읽기와 쓰기 충돌 줄이는 데이터베이스 동시성 제어
MVCC의 스냅샷 읽기와 데이터 버전 관리 방식, 장단점, PostgreSQL·Oracle·InnoDB 구현 차이를 정리합니다.
2026-08-14 · 최초 발행 2025-08-10
읽기와 쓰기가 같은 데이터를 만날 때
여러 트랜잭션이 동시에 데이터에 접근하는 데이터베이스에서는 일관성을 지키면서도 처리 흐름을 막지 않는 동시성 제어가 필요하다. 다중버전 동시성 제어(Multi-Version Concurrency Control, MVCC)는 데이터를 갱신할 때 기존 값을 덮어쓰지 않고 새 버전을 만들어 이 문제를 다룬다.
각 트랜잭션은 특정 시점의 데이터베이스 스냅샷을 읽는다. 따라서 읽기 작업은 쓰기 작업과 독립적으로 실행될 수 있고, 데이터 일관성을 유지하면서 동시성을 높일 수 있다.
트랜잭션이 바라보는 데이터 버전
트랜잭션 ID와 시작 시점
MVCC에서는 모든 트랜잭션에 고유한 타임스탬프 또는 트랜잭션 ID를 부여한다. 이 값은 트랜잭션의 시작 시점을 나타내며, 어느 데이터 버전을 볼 수 있는지 판단하는 기준이 된다.
하나의 레코드에 남는 이력
데이터 항목은 하나의 값만 갖지 않고 여러 버전으로 존재한다. 각 버전에는 데이터 값과 생성 트랜잭션 ID인 xmin, 삭제 트랜잭션 ID인 xmax가 함께 기록된다.
읽기 트랜잭션은 자신의 타임스탬프를 기준으로 볼 수 있는 버전을 고른다.
- 생성 트랜잭션 ID가 현재 트랜잭션 ID 이하인 버전
- 삭제 트랜잭션 ID가 현재 트랜잭션 ID보다 크거나
NULL인 버전
첫 조건은 해당 버전이 트랜잭션 시작 전이나 동시에 생성됐음을 뜻한다. 두 번째 조건은 해당 버전이 트랜잭션 시작 뒤에 삭제됐거나 아직 삭제되지 않았음을 뜻한다.
수정은 새 버전을 만든다
데이터를 수정할 때는 새 버전을 만들고, 이전 버전의 삭제 트랜잭션 ID를 현재 트랜잭션 ID로 설정한다.
잠금 경합을 줄이는 대신 생기는 부담
MVCC의 핵심 이점은 읽기와 쓰기가 서로를 차단하지 않는다는 점이다. 읽기 트랜잭션은 자신에게 맞는 버전을 읽고, 쓰기 트랜잭션은 새 버전을 생성한다. 전통적인 잠금 기반 동시성 제어보다 읽기-쓰기 충돌을 크게 줄일 수 있으며, 읽기 작업에 잠금이 필요하지 않아 데드락 가능성도 낮아진다.
트랜잭션은 시작 시점의 일관된 스냅샷을 보므로, 진행 중인 다른 트랜잭션의 변경 사항에 영향을 받지 않는다.
반대로 여러 버전을 보관해야 하므로 저장 공간이 추가로 필요하다. 더 이상 필요하지 않은 이전 버전을 정리하는 가비지 컬렉션 메커니즘도 필요하다. 구현과 운영은 단순한 잠금 기반 접근보다 복잡하며, MVCC만으로 쓰기-쓰기 충돌을 해결할 수는 없다. 상황에 따라 2단계 잠금 같은 추가 제어 메커니즘이 필요할 수 있다.
DBMS마다 다른 버전 보관 방식
PostgreSQL은 튜플 수준에서 MVCC를 구현한다. 각 튜플에 xmin과 xmax 필드를 두고, VACUUM 프로세스로 더 이상 필요하지 않은 튜플을 정리한다. HOT(Heap-Only Tuple) 업데이트는 공간 효율성을 개선하는 데 사용된다.
Oracle은 롤백 세그먼트에 변경 전 데이터 이미지를 저장하고, SCN(System Change Number)으로 버전을 관리한다. 일관된 읽기가 필요할 때는 롤백 세그먼트에서 적절한 버전을 찾는다.
MySQL InnoDB는 언두 로그에 변경 전 데이터를 기록한다. 트랜잭션 ID로 버전을 관리하며, 읽기 일관성을 위해 언두 로그에서 필요한 버전을 검색한다.
MVCC가 맞는 작업 환경
분석과 보고처럼 읽기 작업이 많은 환경에서는 쓰기 작업으로 인한 차단 없이 일관된 데이터를 읽을 수 있다. 금융 거래나 전자상거래처럼 고가용성이 필요한 시스템에서도 서비스 중단 없이 동시 트랜잭션을 처리하는 데 활용할 수 있다.
분산 데이터베이스에서는 노드 간 동기화 문제를 완화하고 일관된 읽기를 제공한다. 금융 거래 시스템에서는 계좌 조회와 거래 처리를 함께 수행할 수 있고, 고객이 계좌 정보를 조회하는 동안에도 거래 처리가 지연 없이 이루어진다.
전자상거래 플랫폼에서는 상품 검색과 조회가 상품 재고 업데이트에 영향을 받지 않도록 구성할 수 있다. 수많은 사용자가 상품을 탐색하는 동안에도 주문 처리와 재고 업데이트가 원활히 진행된다.
데이터 웨어하우스에서는 분석 쿼리가 실행되는 중에도 데이터 로드와 업데이트를 계속할 수 있다. 분석가는 일관된 데이터 스냅샷을 기반으로 장시간 쿼리를 실행한다.
운영에서 확인할 지점
오래된 버전을 효율적으로 정리하는 메커니즘이 필요하며, 정리 주기와 방식은 성능에 크게 영향을 준다. 롤백 세그먼트나 언두 로그처럼 버전 정보를 보관할 공간의 크기와 관리 방식도 결정해야 한다.
트랜잭션 ID나 타임스탬프가 최대값에 도달했을 때의 처리 방안도 마련해야 한다. 쓰기-쓰기 충돌은 MVCC와 함께 사용할 낙관적 동시성 제어, 2단계 잠금 등의 충돌 해결 메커니즘을 선택해 다룬다.
MVCC는 읽기와 쓰기의 충돌을 최소화하면서 트랜잭션의 독립성과 일관성을 보장한다. 저장 공간 관리, 가비지 컬렉션, 충돌 해결이라는 과제는 남지만, 이를 관리할 수 있다면 확장성이 필요한 데이터베이스 시스템에 적합한 기반이 된다.