MVCC 란?
데이터베이스에는 많은 사용자들이 동시에 접근할 수 있다.
또한, 여러 사용자가 데이터를 변경할 수 있고 동시에 읽을 수도 있다.
이때 실시간으로 변경되는 데이터들은 어떻게 처리할까??
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 를 통해 제어함 *