MVCC(Multi-Version Concurrency Control) 기법
Published in
3 min readOct 2, 2019
- 본 포스팅에서는 연구실에서 DBMS의 동시성 제어 기법을 공부하면서 가장 중점적으로 연구한 MVCC 기법에 대해 설명합니다.
- 이미 MVCC에 대해 설명해 놓은 좋은 포스팅들이 많은 관계로, MVCC를 총괄적으로 정리하고, CC기법들의 anomaly를 방지하는 방법들을 중점적으로 다룹니다.
- 해당 포스팅은 MySQL/InnoDB를 기반으로 설명됩니다.
- 많은 논문들을 참고했으며, 특히 아래 논문에서 많은 내용을 참고했습니다.
Wu, Yingjun, et al. “An empirical evaluation of in-memory multi-version concurrency control.” Proceedings of the VLDB Endowment 10.7 (2017): 781–792.
1. MVCC란?
- 하나의 logical한 대상에 대해서 여러개의 physical한 버젼을 유지하고 있는 기법임.
여기서의 logical과 physical은 흔히 CS분야에서 사용되는 개념과 같다 (LBA, PBA같은거). 즉, 겉으로 보면 row는 하나일 수 있지만, 들여다보면 실제로는 여러개의 버젼들이 존재한다는 의미.
- writer don’t block reader, reader don’t block writer. 쓰기 동작은 읽기동작을 막지 않고, 읽기동작은 쓰기동작을 막지 않는다. 다만, 같은 오브젝트에 대한 write-write 충돌은 발생할 수 밖에 없다.
- Write: 새로운 버전을 만든다.
- Read: 어떤 수행도 막지 않으면서, 읽을 수 있는 최신 버전을 읽어온다.
2. MVCC Design
- Version을 관리하는 방식은 정말 많이 존재하며, 다음 포스팅부터 하나씩 살펴보도록 한다. 일단 가장 기본적인 아래 세 가지 방법에 대해 설명하려고 한다.
- MVTO: Timestamp 기법을 적용해서 Serialization order 정해주기
- MVOCC: 낙천적 동시성 제어 기법을 이용해서 order 결정
- MV2PL: 2 Phase Locking 기법을 이용해서 order 결정
3. MVCC 메타 데이터
- 구현 방식은 다를지 몰라도, 보통 각 튜플 버전에는 공통적으로 존재하는 메타 데이터들이 있다.
- txn-id: X-lock (exclusive lock)을 지정하는 필드. 이 필드 값이 트랜잭션의 Tid와 같거나, 0으로 되어 있어야 해당 버젼을 수정할 수 있다.
- begin-ts, end-ts: 1번에서 MVCC의 read는 ‘읽을 수 있는(visible한)’ 최신 버전을 읽어온다 했는데, 이를 결정하는데 있어 해당 필드가 사용된다. 트랜잭션의 Tid가 두 필드 값 사이에 있어야 visible한 버젼이라고 판단된다.
4. MVCC 예시 — Read
- Txn#2는 오브젝트 A를 읽어오려고 할때, 세가지 버전 Ax, Ax+1와 Ax+2중 visible하면서 최신 버젼인 Ax+1을 읽어오게 된다.
5. MVCC 예시 — Write
- B를 write하려는 Txn#1은 새로운 버전 Bx+1을 만들고, X-lock을 지칭하는 Txn-id 필드를 자신의 Tid로 설정한다.