MVCC
ordilov / 2022. 1. 16
MVCC
Multi Version Concurrency Control의 약자로 다중 버전 동시성 제어를 뜻합니다.
먼저 동시성 제어부터 이해해야 합니다.
Concurrency Control
트랜잭션을 사용하는 데이터베이스에서 동시에 여러 사람이 사용 중입이라고 가정합니다.
- 사용자 A가 트랜잭션 내에서 Y 데이터를 수정했습니다.
- 사용자 B가 A의 트랜잭션이 끝나기 전 Y 데이터를 읽습니다.
- 사용자 A가 트랜잭션에서 에러가 발생해 롤백을 실행합니다.
이 상황에서 사용자 B는 잘못된 Y 데이터를 읽게 됩니다.
이런 상황을 방지하기 위해 한 명이 사용중일 때 막는 Lock을 이용합니다.
Lock을 사용하면 안전한 데이터만 사용할 수 있지만 동시에 사용할 수 있는 기능이 떨어집니다.
따라서 안전성과 동시성을 위해서 어떻게 Lock을 걸지 결정하는 것이 동시성 제어입니다.
Multi Version
두 트랜잭션이 같은 데이터를 수정하려고 하면 Lock을 거는 걸 막기는 힘듭니다.
하지만 위의 상황처럼 한 쪽이 쓰고 있는 중에 읽을 때는 피해갈 수 있습니다.
위에서 사용자 B가 Y 데이터를 읽으려고 한다면 원하는 데이터는 트랜잭션이 실행되기 전 커밋값입니다.
트랜잭션 진행중일 때 달라진 변경값을 바로 적용하지 않고 임시로 따로 저장하면 어떨까요?
가장 일반적으로 사용하는 방법이 스냅샷을 이용해 변경 부분만 따로 관리하는 것입니다.
이렇게 되면 읽을 때는 예전 스냅샷을 읽어 트랜잭션이 실행되기 전 값을 읽습니다.
트랜잭션이 성공적으로 처리되면 커밋된 결과가 최신 스냅샷이 최종 스냅샷이 됩니다.
트랜잭션이 실패했다면 최신 스냅샷을 삭제하면 됩니다.
이렇게 되면 데이터베이스에는 동시에 여러 버전이 존재하게 됩니다.
이 방법으로 동시성을 제어하는 것을 MVCC 라고 합니다.