MVCC
MVCC
MVCC란
Multiversion concurrency control의 약자로, DBMS에서 concurrency control을 수행하기 위해 데이터의 여러 버전을 만드는 방법.
Concurrency Control
트랜잭션이 다수의 사용자에게 동시에 수행될 때 DB의 일관성을 해치지 않도록 제어하는 방법. 다음과 같은 메커니즘 존재.
- Optimistic: 데이터를 읽을 때 Lock을 걸지 않고 커밋하기 전에 문제가 생기면 취소하는 방법.
- Pessimistic: 동시성 문제가 생길 수 있다면 해당 위험이 종료될 때 까지 lock을 거는 방법.
- Semi-optimistic: 일부는 optimistic하게, 일부는 pessimistic하게 처리하는 방법.
Problem of Lock
Lock을 이용하게 되면, 테이블 레벨에 lock을 걸거나 오랜 시간 lock을 걸어서 동시성 저하가 심각해질 수 있음. 이를 해결하기 위해 MVCC 사용.
MVCC 구현
MVCC를 구현하기 위해 다음과 같은 두 가지 방법이 사용됨.
- 여러 버전의 데이터를 DB에 저장.
- 최신 버전의 데이터만 DB에 저장.
여러 버전의 데이터를 DB에 저장
- PostgreSQL, Interbase, SQL server 등에서 사용.
- 각 데이터의 여러 복사본을 만들어서 문제를 해결.
- 주기적으로 오래된(다시 사용되지 않을) 버전의 데이터를 삭제.
최신 버전의 데이터만 DB에 저장
- Oracle, MySQL 등에서 사용.
- 가장 최신의 데이터를 저장하는 데이터 영역과 변경 전의 값을 저장하는 UNDO 영역으로 관리.
- DB의 isolation level에 따라 데이터를 읽는 장소가 다름.
MVCC 특징
- Lock을 사용하지 않으므로 일반적인 RDBMS보다 빠르게 작동.
- 데이터의 버전이 충돌할 수 있고, 이를 해결할 필요성 존재.
References
- https://en.wikipedia.org/wiki/Multiversion_concurrency_control
- https://velog.io/@yangsijun528/MVCC-%EB%9E%80
- https://mangkyu.tistory.com/53
- https://en.wikipedia.org/wiki/Concurrency_control