kiwi

다중 버전 동시성 제어[multiversion concurrency control, MCC, MVCC]

by 키위먹고싶다

db

다중 버전 동시성 제어

공유 데이터를 다룰 때 동시에 다수의 유저들이 동일한 데이터에 접근하는 상황이 발생한다. 이러한 동시 실행 제어의 문제점을 해결해서 데이터의 일관성을 유지하기 위해 기존에는 locking방식을 사용했다. 그러나 locking은 쓰기가 발생할 때 대기 상태가 발생하며 쓰기가 많이 발생하는 서버에서는 동시성을 떨어뜨린다. 

 

그래서 어떤 데이터가 여러차례 수정될 경우 수정이 가해진 시점의 개별 버전을 모두 저장하여  데이터 객체를 개별 버전들의 연속체로 정의함으로써 읽기와 쓰기 간의 경합을 최소화할 수 있는 다중 버전 동시성 제어의 개념이 생겼다. 

 

개별 버전을 모두 저장, 즉 스냅샷을 사용한다는 점이 mvcc의 특징이다. 

 

MGA

튜플을 업데이트 할 때 새로운 값으로 변경하는 것이 아니라 [쉽게 말해 replace처리]  새로운 튜플을 추가하고, 이전 튜플은 유효 범위를 마킹하여 처리하는 방식이다. 

이 그림은 레코드2가 갱신되었을 때 기존 데이터에 삭제 표시가 생기고 새로운 데이터가 추가되며 파일 사이즈도 증가됨을 나타낸다. 데이터베이스 내에 다중 버전의 데이터를 저장하고 더 이상 필요하지 않을 때 데이터를 정리한다. 

데이터가 많아지는 형식이므로 파일 사이즈가 계속 증가한다. 

 

Undo Segment[Rollback Segment]

오라클에서는 언두라는 영역을 따로 두고 최신 데이터는 데이터 영역에 두어 old버전만 언두 영역에 두고 레코드 갱신에 대한 버전 관리를 하는 방식이다.

 

변경 작업이 완료되지 않은 상태에서 다른 사용자가 같은 영역에 읽기 작업을 수행 하면, 각 레코드의 SCN정보[select 수행 시 갖는 고유한 정보]를 확인해서 언두 영역을 찾아 해당 버전의 레코드를 가져와 메모리에 로드하고 읽을 수 있게 처리한다. 

 

 

업데이트가 실행되면 기존 데이터 블록을 새로운 데이터로 변경하고, 이전 데이터는 undo segment에 보관된다. 데이터 변경 중, select가 수행되면 select쿼리는 SCN이라는 고유한 번호를 가지고 쿼리의 SCN번호보다 작은 데이터 파일의 SCN만 읽는다. 데이터가 변경되면 SCN도 변경되기 때문에 이 파일은 변경된 파일로 인식하고, segment에서 이전 버전의 데이터 파일을 찾아 읽게 된다. 

 

MGA와 차이점은 데이터의 물리적인 위치가 변경되지 않는다는 점이다. MGA는 업데이트가 발생한 물리적 위치가 변경되므로 업데이트를 할때 인덱스 수정작업이 일어나는데 이 방법은 인덱스 파일을 수정할 필요가 없이 undo에서 찾아오면 되기 때문이다. 

'db' 카테고리의 다른 글

MySQL 옵티마이저 실행계획  (0) 2023.06.24
뮤텍스(Mutex)와 세마포어(Semaphore)  (0) 2022.06.18
[MySQL] 바이너리 로그  (0) 2022.06.18
[MySQL] 잠금에 대해  (0) 2022.06.11
Mysql Redo / Undo Log  (0) 2022.04.16

블로그의 정보

kiwi

키위먹고싶다

활동하기