긍정적인 사고와 행동으로 선한 영향력을 줄 수 있도록

PostgreSQL

MVCC 란?

리거니 2022. 9. 22. 10:21

데이터베이스에는 많은 사용자들이 동시에 접근할 수 있다.

또한, 여러 사용자가 데이터를 변경할 수 있고 동시에 읽을 수도 있다.

이때 실시간으로 변경되는 데이터들은 어떻게 처리할까??

 

MVCC (Multi-Version Concurrency Control)

다중 버전 동시성 제어

동시에 여러 개의 데이터 버전을 제공할 수 있는 기법

최신상태의 데이터를 [현재 버전], 변경 이전의 데이터를 [이전 버전]을 의미한다.

단, 두개의 버전을 동일한 테이블 내에서 보관함으로써

불편함과 공간의 비효율성 발생

이에 모아둔 데이터를 Vaccum 작업을 통해 정리한다.

쿼리가 수행한 시점에서 데이터를 읽을 수 있는 기능 XID가 생성된다.

이를 통해, 읽기와 쓰기 작업 간의 블로킹 현상을 제거함으로써 동시성 ↑

레코드별로(하나의 행) XID를 관리한다.

이전 데이터 1 현재 데이터 2 ... ( 점차 증가 )

크기가 클수록 공간 비효율성으로 인해 4바이트 정수형을 사용 (최대 약 43억)

모두 소진한 경우 다시 1부터 시작

방법

테이블 내부에 [이전 버전]과 [현재 버전]의 데이터를 위치시킨다.

각 레코드 별로 XID를 순서대로 생성하여 식별한다.

수행 시점의 트랜젝션 ID와 XID의 비교를 통해 MVCC를 구현한다.

XMIN / XMAX 구분

XMIN

- INSERT/UPDATE 수행한 XID를 기록한다,

XMAX

- DELETE/UPDATE 수행한 XID를 기록한다.

구분

데이터 변경 시 마다,

이전 버전의 데이터를 블록 내 삭제하고

현 버전의 데이터를 저장한다.

데이터 읽기중 트랜젝션 시작 이후 변경된 값을 발견 시,

이전 버전의 삭제된 데이터를 읽는다.

세션에서 읽어 들일때, xmin과 xmax 사이의 ID만 접근허용

PostgreSQL 은 DDL도 커밋해야 함 !!

* DDL (Create Alter Drop Truncate)

* Oracle 에서는 Redo 와 Undo 를 통해 제어함 *