1. 풀어쓰기
약어를 풀면, 다중버전 병행수행제어 (MultiVersion Concurrency Control)가 된다.
쓰기트랜잭션이 읽기트랜잭션을 블로킹하지 않고,
읽기트랜잭션이 쓰기트랜잭션을 블로킹하지 않고,
각 트랜잭션마다 스냅샷 이미지를 보장해 주는 메커니즘을 말한다.
2. 왜 나왔을까?
데이터베이스에서 일관된 데이터를 얻는 것이 굉장히 중요하다.
만약 만원권 1,000장을 가진 사람이 있다고 가정해보자. (부럽다..)
만원권이 1,000장이 맞는지 세고 있을때, 다른 사람들이 몇 개의 만원권을 넣거나 빼거나 한다면 세고 있는 사람은 당연히 제대로 셀 수 없다.
가장 쉽게는 셀 동안은 다른 사람들이 넣거나 빼지 않게 보장하는 것이 일관된 데이터를 얻는 방법이다.
그래서 무조건 1,000장을 셀때 까지 돈을 넣거나 빼려는 사람이 줄을 서있다고 가정해보자.
굉장한 비효율이 예상된다. 일관된 데이터를 얻자고 엄청난 비효율을 만든다면 그것은 좋은 방법이 아닐 수 있다.
그래서 나온 개념이 MVCC라고 보면 된다.
정확한 비유는 아닐수도 있지만 비유를 해보자면,
만원권 1000장을 작업마다 1000장씩 종이 만원권으로 복사해서 각자 종이 만원권에 넣고 빼게 하고 가면 만원권을 다 세는 작업을 끝내고 종이 만원권들에 작업해놓은 것들을 보고서 돈의 양을 정확하게 맞춘다고 볼 수 있다.
종이 만원권이 스냅샷이고, 작업이 트랜잭션, 읽기트랜잭션이 돈을 세는 작업, 쓰기트랜잭션이 돈을 넣고 빼는 것으로 빗댈 수 있다.
3. 동시성 제어를 위해서 MVCC를 활용하는 거면 따로 락은 필요 없겠네요?
MVCC라는 개념만 활용하면 100% 일관된 데이터를 얻을 수 있다고 말할 수 없다. MVCC 개념을 각 데이터베이스별 트랜잭션 격리수준에 따라 락의 개념을 더해 활용하면 원하는 데이터베이스 동시성 제어를 해낼 수 있는 개념이다.
4. MVCC의 종류
대표적으로 두가지 방법이 존재한다.
첫번째는 Perssimistic Lock을 사용하는 MGA(Multi Generation Architecture)로 데이터(튜플)을 replace하지 않고 같은 영역에 추가로 보관해놓고 활용하는 방법이다. 대표적으로 postgresql이 위의 방법을 택한다.
두번째는 롤백세그먼트, 언두세그먼트라는 방법인데, 위와 달리 데이터(튜플)을 replace하고 별도저장소에 변경전 데이터를 보관해놓고 활용하는 방법이다. 대표적으로 oracle, mysql(innodb)가 있다.
5. 무엇을 잘 알아야하는가?
검색을 해보면 MGA 방식은 주기적으로 Vacuum(데이터 진공청소)을 해줘야하는 특징이 있고, 좀 더 오래된 방법이라고 설명하고 있어 약간 덜 진보된 방법인 것처럼 보이긴 하는데, 그렇다고 대놓고 '안 좋다', '단점이 많다'는 없는 걸로 봐서 방법이 차이일뿐 성능의 차이가 엄청나게 난다고 보기엔 어려워 보인다. 그래서 막 MVCC 방법들에 대하여 명확하게 알아야될 개념으로 보이진 않는다.
현업에서는 RDBMS에 MVCC라는 개념이 동시성 제어를 위해 존재한다 정도만 알고 있으면 큰 문제 없어 보인다. 이것보다 트랜잭션의 격리수준이나 락의 개념을 아는 것이 훨씬 도움이 될 것으로 보인다.
6. 참고자료
https://www.datanet.co.kr/news/articleView.html?idxno=116534
https://www.slideshare.net/pgday_seoul/mvcc-in-postgre
https://mysqldba.tistory.com/335
'Googling > cs' 카테고리의 다른 글
[DB] 트랜잭션 격리수준과 부정합 이슈 (feat. Dirty Read ~ Phantom Read) (0) | 2022.04.23 |
---|---|
[CS] 동기(synchronous)와 비동기(Asynchronous)를 쉽게 이해해보기 (feat. 싱크로나이즈드 수영과 핫도그) (0) | 2022.03.18 |
[하드웨어] 보조기억장치 인터페이스 이해 (feat. HDD, SSD, NVMe, PCIe, M.2, SATA) (1) | 2021.06.04 |
[DATA] 데이터양 단위 이해 (feat. B, MB, GB, TB + LTE 속도?) (0) | 2021.06.04 |
[HTTP] RESTful API 이해 (feat. 신입개발자 자격요건) (0) | 2021.05.18 |