읽기와 쓰기를 분리하는 방식

MVCC는 버전 체인을 남기고, 격리 수준은 그중 어디까지 읽을지를 정합니다.

같은 행이라도 쓰기는 새 버전을 추가하고, 읽기는 자기 스냅샷에 맞는 버전에서 멈춥니다. 그래서 읽기와 쓰기가 서로를 덜 막으면서도 일관성을 유지합니다.

공유된 행 히스토리

최신 커밋 버전
salary=400
UPDATE가 만든 새 버전
→
이전 버전
salary=350
undo / tuple 기록으로 연결
→
더 과거 버전
salary=300
오래된 스냅샷이 참조 가능
READ COMMITTED 계열 읽기
문장 시작 시점의 최신 커밋을 읽음
대개 400을 보지만, 다음 SELECT에서는 더 새 커밋을 볼 수 있습니다.
고정 스냅샷 읽기
트랜잭션 시작 시점의 버전에서 멈춤
예전 스냅샷이면 350이나 300을 계속 읽어도, 쓰기 트랜잭션을 기다리지 않습니다.

격리 수준이 바꾸는 것

READ COMMITTED
SELECT 문마다 새 스냅샷을 잡아 최신 커밋 기준으로 읽습니다.
REPEATABLE READ
트랜잭션 시작 시점 스냅샷을 유지해 같은 읽기 결과를 더 오래 보장합니다.
SERIALIZABLE
MVCC만으로 부족한 충돌은 추가 검증이나 락으로 막아 직렬성을 맞춥니다.
핵심: MVCC는 읽기가 최신값만 보는 기술이 아니라, 버전을 남겨 두고 각 읽기에 허용된 시점을 고르는 방식입니다.