Skip to content

MVCC (Multi-Version Concurrency Control)

다중 버전 동시성 제어. 데이터베이스에서 동시 접근을 허용하기 위해 데이터의 여러 버전을 유지하는 기법

기존의 Locking 방식은 읽기 작업과 쓰기 작업이 서로 락(Lock)을 걸어 대기 상태에 빠지는 문제(성능 저하)가 있었다. MVCC는 이를 해결하기 위해 데이터의 버전을 관리하여 락을 사용하지 않고도 일관된 읽기를 제공한다.

핵심 동작 원리

  • 쓰기(Write): 데이터를 수정할 때 기존 데이터를 덮어쓰지 않고, 새로운 버전의 데이터를 생성한다.
  • 읽기(Read): 데이터를 읽을 때, 트랜잭션이 시작된 시점을 기준으로 자신에게 일관된 최신 버전의 데이터를 읽는다(Snapshot Read).
  • Undo Log: 변경되기 이전의 데이터는 Undo Log(또는 Rollback Segment)에 보관되어 다른 트랜잭션의 읽기 요청 시 제공된다.

장점

  • 읽기와 쓰기 간의 충돌 방지: 읽기 작업이 쓰기 작업을 블로킹하지 않으며, 쓰기 작업도 읽기 작업을 블로킹하지 않아 동시성이 크게 향상된다.
  • 일관된 읽기 보장: 특정 트랜잭션 진행 중 다른 트랜잭션이 데이터를 변경하더라도, 시작 시점의 스냅샷을 통해 일관된 데이터를 조회할 수 있다.

단점

  • 여러 버전의 데이터를 유지해야 하므로 **추가적인 저장 공간(스토리지)**이 필요하다.
  • 주기적으로 사용하지 않는 이전 버전의 데이터를 정리(Garbage Collection, MySQL의 경우 Purge)하는 작업이 필요하다.

대표적인 사용 RDBMS

  • MySQL (InnoDB): Undo Log를 통해 MVCC 구현
  • PostgreSQL: 레코드 자체에 버전을 기록하고(Vacuum으로 정리) MVCC 구현
  • Oracle: Rollback Segment를 활용하여 구현