공통 기반은 하나입니다
하나의 버전 체인, 달라지는 읽기 규칙
핵심은 "버전을 여러 개 저장한다"가 아니라, 같은 트랜잭션이 그중 어떤 버전을 언제까지 계속 보느냐입니다.
격리 수준은 그 선택 규칙을 조정합니다.
오래된 커밋
v1
이전 트랜잭션이 남긴 확정 버전
스냅샷 기준점
v2
현재 읽기가 선택할 수 있는 기준 버전
더 늦게 커밋
v3
다음 SELECT에서는 보일 수도 있는 새 버전
아직 미커밋
미커밋
READ UNCOMMITTED에서만 직접 읽힐 수 있음
1. 스냅샷을 언제 다시 잡는가
문장마다 새로 잡으면 READ COMMITTED, BEGIN 시점으로 고정하면 REPEATABLE READ가 됩니다.
2. MVCC 밖의 충돌 제어를 더 붙이는가
SERIALIZABLE은 잠금이나 SSI 같은 검증으로 범위 충돌까지 통제해 직렬 실행에 가깝게 맞춥니다.
읽는 포인트: 격리 수준이 올라갈수록 같은 트랜잭션이 보는 버전은 더 오래 고정되고,
마지막 단계에서는 MVCC만으로 부족한 충돌까지 따로 제어합니다.
예외
READ UNCOMMITTED
미커밋 변경까지 읽으므로, "커밋된 버전 중에서 보이는 값을 고른다"는 MVCC의 장점을 거의 활용하지 않습니다.
READ COMMITTED
SELECT마다 새 스냅샷
같은 트랜잭션 안에서도
첫 SELECT → v2(120), 다음 SELECT → v3(135)
Dirty Read는 막지만, 다시 읽었을 때 값이 달라질 수 있어 Non-Repeatable Read가 가능합니다.
REPEATABLE READ
BEGIN 시점 스냅샷 고정
같은 트랜잭션 안에서는
첫 SELECT → v2(120), 다음 SELECT도 계속 v2(120)
반복 조회가 안정적입니다. 즉, 같은 행을 다시 읽어도 값이 흔들리지 않는 방향으로 동작합니다.
SERIALIZABLE
MVCC + 잠금/SSI
추가로 제어하는 것
보는 버전뿐 아니라 읽기 순서와 범위 충돌까지 통제
가장 강한 일관성을 목표로 하지만, 그만큼 동시성 비용도 커집니다.