Ordinary
About

MVCC

profileordilov / 2022. 1. 16
MVCC

Multi Version Concurrency Control의 약자로 다중 버전 동시성 제어를 뜻합니다.
먼저 동시성 제어부터 이해해야 합니다.

Concurrency Control

트랜잭션을 사용하는 데이터베이스에서 동시에 여러 사람이 사용 중입이라고 가정합니다.

  1. 사용자 A가 트랜잭션 내에서 Y 데이터를 수정했습니다.
  2. 사용자 B가 A의 트랜잭션이 끝나기 전 Y 데이터를 읽습니다.
  3. 사용자 A가 트랜잭션에서 에러가 발생해 롤백을 실행합니다.

이 상황에서 사용자 B는 잘못된 Y 데이터를 읽게 됩니다.
이런 상황을 방지하기 위해 한 명이 사용중일 때 막는 Lock을 이용합니다.
Lock을 사용하면 안전한 데이터만 사용할 수 있지만 동시에 사용할 수 있는 기능이 떨어집니다.
따라서 안전성과 동시성을 위해서 어떻게 Lock을 걸지 결정하는 것이 동시성 제어입니다.

Multi Version

두 트랜잭션이 같은 데이터를 수정하려고 하면 Lock을 거는 걸 막기는 힘듭니다.
하지만 위의 상황처럼 한 쪽이 쓰고 있는 중에 읽을 때는 피해갈 수 있습니다.
위에서 사용자 B가 Y 데이터를 읽으려고 한다면 원하는 데이터는 트랜잭션이 실행되기 전 커밋값입니다.
트랜잭션 진행중일 때 달라진 변경값을 바로 적용하지 않고 임시로 따로 저장하면 어떨까요?
가장 일반적으로 사용하는 방법이 스냅샷을 이용해 변경 부분만 따로 관리하는 것입니다.
이렇게 되면 읽을 때는 예전 스냅샷을 읽어 트랜잭션이 실행되기 전 값을 읽습니다.
트랜잭션이 성공적으로 처리되면 커밋된 결과가 최신 스냅샷이 최종 스냅샷이 됩니다.
트랜잭션이 실패했다면 최신 스냅샷을 삭제하면 됩니다.
이렇게 되면 데이터베이스에는 동시에 여러 버전이 존재하게 됩니다.
이 방법으로 동시성을 제어하는 것을 MVCC 라고 합니다.