행 안에서 버전이 시작된다

InnoDB는 현재 레코드에 이전 버전으로 가는 단서를 함께 저장합니다.

사용자 컬럼만 보면 최신 값 하나뿐이지만, hidden column을 같이 보면 누가 이 값을 만들었는지와 어디서 더 오래된 버전을 찾아야 하는지가 드러납니다. 그래서 읽기는 필요한 시점까지 뒤로 따라갈 수 있습니다.

현재 레코드 내부 사용자 값 + hidden column
사용자 컬럼
id, balance

id = 1, balance = 1000

애플리케이션이 직접 읽고 쓰는 현재 값입니다.

겉으로는 값 하나처럼 보이지만, 오른쪽 hidden column이 이 값의 이력을 추적하게 만듭니다.

hidden
DB_TRX_ID = 100

최신 버전을 만든 트랜잭션 ID입니다. 현재 값이 어느 변경 결과인지 알려 줍니다.

hidden
DB_ROLL_PTR = undo#42

이전 버전으로 가는 핵심 포인터입니다. 일관성 읽기가 더 오래된 값을 원하면 이 위치부터 따라갑니다.

hidden
DB_ROW_ID (필요 시)

기본 키가 없을 때만 추가되는 내부 식별자입니다.

DB_ROLL_PTR가 가리키는 체인 현재 값에서 과거 값으로

일관성 읽기가 지금 값이 너무 최신이라고 판단하면, 포인터를 따라 Undo 버전으로 이동해 필요한 시점의 값을 찾습니다.

현재 레코드
TRX 100이 만든 최신 값

balance = 1000 · 현재 페이지에 남아 있는 버전

Undo 버전 1
TRX 90 이전 상태

balance = 800 · DB_ROLL_PTR가 가장 먼저 따라가는 과거 값

Undo 버전 2
TRX 80 이전 상태

balance = 500 · 더 오래된 스냅샷이 필요하면 계속 뒤로 이동