본문 바로가기
DBMS기초

17. MVCC

by 모모레 2019. 5. 24.

MVCC 는 MultiVersion Concurrency Control의 약자로 DBMS에서 Lock을 사용하지 않고, 데이터의 읽기 일관성을 보장해주는 내부 기법이다. DB는 Lock을 기본으로 하여 데이터 파일에 작성된 데이터의 일관성을 보장하는 것을 기본으로 하지만, 이것은 쓰기가 발생하는 경우에는 대기에 빠지게 하기 때문에, 쓰기가 많이 발생하는 서버에서의 동시성을 크게 떨어뜨린다. 

이러한 문제를 해결하기 위해 David P. Reed 는 특정 논문을 통해 새로운 아이디어를 제안했는데, 그것이 바로 MVCC의 기본이 된다. 

즉, 객체의 변경사항을 모두 버젼을 나누어 저장하고, 데이터 객체는 이 버젼을 모두 연속체로서 정의하여 관리하게 하여 락을 사용하지 않고 일관된 읽기를 보장해 주는 아이디어를 제안하였다. 

1970년대에 나왔던 이 개념은 추후에 MVCC라는 용어로서 정리되고, 1984년 DEC의 짐 스타키라는 사람에 의해 처음으로 구현되었다. 그리고, 그것을 기반으로 Interbase DB를 개발하였다. 

이후 다른 RDBMS에서도 MVCC개념을 구현화 하여 쓰기와 읽기의 동시성을 높이기 위해 노력하였다. 

이때 각 RDBMS에서 구현된 MVCC는 크게 그 구현 방식에 따라 2가지로 나눌 수 있다. 

 

1. Pessimistic Lock을 사용한 방식 

2. Undo Segment를 사용한 방식 

 

 

1. Perssimistic Lock을 사용하는 MGA 

처음 짐 스타키가 구현한 방식으로 MGA : Multi Generation Architecture라고 부른다. MGA는 튜플을 업데이트 할때 새로운 값으로 변경하는 것이 아니라, 즉, 같은 자리에서 Replace로 처리하는 것이 아니라 새로운 튜플을 추가하고 이전 튜플은 유효 범위를 마킹하여 처리한다. 

이와 같은 방식은 PostgreSQL, SQL Server, InterBase에서 사용하는 방식이다. 

 

2. Undo Segment를 사용하는 방식

Oracle, InnoDB에서 사용하는 방식으로 언두 라는 영역을 따로 두고 최신 데이터는 데이터 영역에 두고 올드 버젼만 언두 영역에 두어 레코드 갱신에 대한 버젼관리를 하는 방식이다.  이것은 1980년대에 오라클의 밥 마이너가 구현한 방식이다. 

만약, 변경 작업이 완료되지 않은 상태에서 다른 세션이 같은 영역에 읽기 작업을 하려고 한다면, DBMS는 각 레코드의 SCN 정보를 확인하여 언두 영역을 찾아서 해당 버젼의 레코드를 가져와 메모리에 로드하고 읽을 수 있게 처리해 준다. 

 

두 방식의 자세한 구현 방법은 다음의 url로 공부해 보자. 

https://www.slideshare.net/pgday_seoul/mvcc-in-postgre

 

 

Mvcc in postgreSQL 권건우

Multi Version Concurrency Control in PostgreSQL PGDay.Seoul 2016

www.slideshare.net

http://www.datanet.co.kr/news/articleView.html?idxno=116534

 

MVCC 아키텍처의 두 가지 흐름 - 데이터넷

MVCC는 다중 버전 병행 수행 제어(MultiVersion Concurrency Control)의 약자로 DBMS에서는 쓰기(Write) 세션...

www.datanet.co.kr

 

'DBMS기초' 카테고리의 다른 글

16. Isolation Level에 따른 트랜잭션 처리 방법  (0) 2019.05.23
15. Lock 기법  (0) 2009.08.17
14. 트랜잭션의 동시성  (0) 2009.05.25
13. 트랜잭션의 상태  (0) 2009.05.25
12. 트랜잭션의 ACID  (0) 2009.03.16