MVCC-2
MVCC-2
MVCC 구현
- MVCC를 이용해 DB에 데이터를 쓰는 경우, 다음과 같은 두 가지 방법 존재
- 다중 버전의 데이터를 DB에 저장하는 MGA(Multi Generation Architecture) 방법
- 최신 버전의 데이터만 DB에 저장하고, 이전 버전은 UNDO 영역에 저장하는 rollback segment 방법
MGA
- PostgreSQL, SQL Server 등에서 사용하는 방법
- DB를 업데이트 하는 경우 기존 데이터를 덮어 씌우지 않고 새 버전의 데이터를 따로 저장
- 데이터별를 저장할 때 데이터별로 XMIN, XMAX 값을 저장
- XMIN: 데이터가 새로 만들어질 때 현재 트랜잭션 ID를 XMIN에 기록
- XMAX: 데이터가 삭제되거나 다른 버전이 생긴 경우 현재 트랜잭션 ID를 XMAX에 기록
- XMAX가 NULL인 데이터가 가장 최신 데이터
- 구현은 쉽지만 다음과 같은 비효율적인 부분 존재
- 많은 양의 데이터를 저장해야 하므로 저장 공간이 많이 필요
- 주기적으로 VACCUM 작업을 통해 데이터를 지워야 함
- 데이터가 변경될 때마다 데이터의 물리적 위치가 변경되므로, 인덱스를 수정해야 함
Rollback Segment
- MySQL, Oracle 등에서 사용하는 방법
- 각 데이터에는 SCN(System commit number)라는 값이 존재
- DB 내에서 발생하는 이벤트의 논리적 시점을 순차적인 숫자로 나타낸 것
- 데이터를 업데이트 하는 경우, 기존 데이터를 새로운 데이터로 변경함
- 기존 데이터는 undo 영역의 rollback segment에 저장됨. 이 때 SCN 값을 같이 저장
- DB에는 항상
최신
의 데이터만 저장됨
- SELECT 쿼리를 보내는 시점에서는 해당 시점의 SCN 값을 가짐
- SELECT로 데이터를 읽는 경우 현재 SCN값보다 작은 SCN을 가지는 데이터만 읽을 수 있음
- 만약 DB에 있는 데이터의 SCN값이 SELECT문의 SCN값 보다
크다면
, rollback segement에서 작은 SCN을 가지는 데이터를 읽음
- MGA와 달리 rollback segement의 값만 지우면 되기 때문에 DB에 대한 vaccum 작업이 불필요
- 그러나 쿼리를 수행하는 동안 rollback segment의 값이 덮어씌워질 경우
snapshot too old
오류가 발생 가능
References
- https://medium.com/monday-9-pm/mvcc-multi-version-concurrency-control-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-e4102cd97e59
- https://scorpio-mercury.tistory.com/32
- https://velog.io/@yangsijun528/MVCC-%EB%9E%80
- https://mozi.tistory.com/561
- https://blog.ex-em.com/1663
기타
2022-10-20 내용을 다시 정리 및 내용 추가