Skip to content

Multiversion concurrency control

다중 버전 동시성 제어(multiversion concurrency control, MCC, MVCC), 다중 버전 병행 수행 제어는 데이터베이스 관리 시스템이 일반적으로 사용하는 동시성 제어 방식으로, 데이터베이스로의 동시 접근을 제공하고 프로그래밍 언어에서 트랜잭셔널 메모리를 구현한다.

About

Multiversion concurrency control(MCC 혹은 MVCC 라고 부른다)는 동시 접근을 허용하는 데이터베이스에서, 동시성을 제어하기 위해서 사용하는 방법 중 하나다.

데이터베이스에 같은 시간에 두 명이상이 데이터를 읽거나 쓰는 경우를 생각해보자. 이런 경우 데이터를 안전하게 읽고 쓰게 하기 위한 몇 가지 동시성 제어 방법들이 있다. 그 중 잠금(lock)을 가장 널리 사용한다. 이유는 ? 구현이 간단해서다. 하지만 이 방법은 데이터베이스 처리 요청을 병렬로 처리할 수 없어서 느리다는 단점이 있다. MVCC는 다른 접근 방식으로 이 문제를 해결한다.

MVCC 모델에서 데이터에 접근하는 각 유저는 접근한 시간 데이터베이스의 snapshot를 읽는다. 이 snapshot 데이터에 대한 변경이 완료 될 때까지 만들어진 변경사항은 다른 데이터베이스 사용자가 볼 수 없다(트랜잭션이 commit 될때까지).

이제 사용자가 데이터를 업데이트 하면, 이전의 데이터를 덮었는게 아니라 새로운 버전의 데이터를 만든다. 대신 이전 버전의 데이터와 비교해서 변경된 내용을 기록한다. 이렇게 해서 하나의 데이터에 대해서 여러 버전의 데이터가 존재하게 된다. 유저는 물론 제일 마지막 버전의 데이터를 읽게 된다.

MVCC의 이런 접근 방식은 잠금을 필요로 하지 않기 때문에 일반적인 RDBMS 보다 매우 빠르게 작동한다. 또한 데이터를 읽기 시작 할 때, 다른 사람이 그 데이터를 삭제하거나 수정하더라도 영향을 받지 않고 데이터를 사용할 수 있다. 대신 주기적으로 사용하지 않는 버전의 데이터를 삭제하는 시스템이 필요하다.

MVCC 모델은 하나의 데이터에 대한 여러 버전의 데이터를 허용하기 때문에 데이터 버전의 충돌이 발생할 수 있다. 충돌은 애플리케이션 영역에서 해결해야 한다.

in PostgreSQL

PostgreSQL에서는 MVCC(Multi-Version Concurrency Control)를 사용하여 데이터베이스 동시성을 제어하고 있습니다. 이는 여러 트랜잭션에서 데이터를 동시에 수정하고, 조회할 수 있도록 하는 역할을 담당합니다. MVCC은 사용자가 값을 변경할 때마다 새로운 데이터를 생성합니다. 그리고 커밋이 되면 새로운 데이터를 최신 데이터로 마킹하는 작업을 수행합니다. 이 과정에서 사용하지 않게 된 과거 데이터를 dead tuple이라고 부릅니다. 이때 dead tuple은 PostgreSQL의 저장 공간을 계속 차지하게 됩니다. 그래서 이 저장 공간을 다시 확보하고 재사용하는 작업이 필요합니다. <- 이짓을 Vacuum이 담당한다.

See also

Favorite site