일단은 프로그래머 나부랭이

MVCC에 관하여 정리 본문

DBMS

MVCC에 관하여 정리

하필이면 도대체가 2021. 3. 25. 11:34

MVCC란
Multi Version Councurrency Control의 줄임말로, 해석하면 '다중 버전 동시성 제어'쯤 된다.
즉 MVCC는 DBMS의 동시성 제어를 위한 데이터 관리 기법이다.
(참고 : ko.wikipedia.org/wiki/다중_버전_동시성_제어)

비교를 위해, 기존의 동시성 제어 방법으로 알려진 Lock의 개념을 잠깐 살펴보자.
lock은 크게 read lock과 write lock으로 나누어진다.
간단하게 살펴보면,
- read lock(shared lock)이 걸린 데이터 D를 A가 점유하고 있을 때, B는 D를 read 할 수는 있지만, write 할 수는 없다.
- write lock(exclusive lock)이 걸린 데이터 D를 A가 점유하고 있을 때, B는 D를 read, write를 할 수가 없다.

lock은 해당 데이터를 선점한 사용자가 데이터의 lock을 해제하기 전까지는 다른 사용자가 해당 데이터를 컨트롤하는데 제약이 있다.
MVCC는 이런 lock의 단점을 보완하기 위한 것이다.

MVCC는 데이터의 업데이트를 할 때, 기존의 내용을 덮어쓰지 않고, 그 데이터의 새로운 버전을 만든다.
쉽게 말해서, A가 D라는 데이터의 D-0버전을 write 할 때, MVCC는 D데이터의 D-1버전을 만들고, 만약 write 도중에 B가 D데이터에 접근하면 D-0버전을 raed 할 수 있도록 해주는 것이다.
때문에 MVCC는 이론상 lock의 개념이 필요없다.
(하지만 일부 DBMS들은 MVCC와 lock을 함께 사용한다고 한다.)

MVCC의 특징을 간단하게 짚고 넘어가면
 - lock 기법만 적용된 DBMS보다 훨씬 빠르게 동작
 - 불필요한 데이터(위에서 말한 데이터 버전과 같은)이 많이 쌓여서 주기적으로 이를 정리해줄 별도의 시스템이 필요하다
 - 데이터 버전이 충돌할 가능성이 있음 (이 때문에 MVCC와 lock을 같이 사용하는게 아닐까 싶네요)

 

MVCC의 불필요한 데이터를 관리하기 위해서는 대표적으로 아래의 방법들이 이용되는 것 같습니다.
 - Vacuum 방식 : 데이터의 버전별 내용을 따로 저장하여 모아두고, 그것을 일정 시점에 삭제한다. (Postgre SQL, CUBRID 등)
    (출처 : postgresql.kr/docs/9.4/routine-vacuuming.html, www.cubrid.org/manual/ko/11.0/sql/transaction.html?#vacuum)
 - Undo Segment 방식 : 데이터의 최신 버전만을 유지하되, old버전은 undo 보관하고, 필요에 따라 undo의 내용을 읽어옴 (Oracle, InnoDB 등)
    (출처 : mysqldba.tistory.com/335 )

'DBMS' 카테고리의 다른 글

(메모) CUBRID python driver test  (0) 2021.10.11
태블릿 pc에서 DBMS 의 benchmark를 돌려보자  (0) 2021.03.28
MSSQL의 timestamp에 대해서  (0) 2018.07.05
varchar와 nvarchar의 차이  (0) 2018.05.29
LOB과 BFILE에 대해서 정리  (0) 2018.04.10

Comments