Engine Atlas

MySQL MVCC: REPEATABLE READ vs READ COMMITTED

secondary index · row versions · consistent read
MySQL 8.4.10captured evidence
English
학습 안내

이 Lab에서 답할 질문

Writer가 COMMIT한 뒤 REPEATABLE READ의 Session A와 READ COMMITTED의 Session C가 같은 SELECT에서 왜 다른 row version을 보나요?

실행 엔진: MySQL 8.4.10
누가 실행하나요?

Session A와 C가 Q-01을 읽고, Session B가 UPDATE·DELETE·INSERT 뒤 transaction을 hold했다가 COMMIT하며, Session O가 fresh result를 관찰합니다.

무엇을 고정하나요?

Q-01은 tenant_id = 7, state = 'READY', FORCE INDEX (idx_tenant_state_order)를 고정합니다.

실행 SQL
SELECT order_id, amount_cents, revision, note
FROM mvcc_orders FORCE INDEX (idx_tenant_state_order)
WHERE tenant_id = 7
  AND state = 'READY'
ORDER BY order_id;
무엇이 달라지나요?

isolation level에 따라 statement가 사용하는 snapshot과 결과 row membership 및 payload가 달라집니다.

무엇이 그대로인가요?

실행 SQL, fixture의 version chain 설명, index identifier와 writer의 committed 변경은 동일합니다.

먼저 예측해 보세요

Session B COMMIT 뒤 두 번째 Q-01에서 무엇이 보일까요?

Session B COMMIT 뒤 두 번째 Q-01에서 무엇이 보일까요?

증거 미션

READ COMMITTED lane에서 Session B COMMIT 이후의 두 번째 read 단계를 열어 어떤 row version과 membership이 보이는지 확인하세요.

어디를 보나요?
Row version lens의 C2 결과와 result diff에서 row 102의 payload와 row 103·106의 membership을 봅니다.
이동할 화면
READ COMMITTED · second-read membership
무엇이 보여야 하나요?
확인할 관찰

C2는 fresh statement snapshot에서 row 102를 amount_cents 2500, revision 2로 보고 row 106=6600을 포함하며 row 103은 결과에서 빠집니다. 같은 시점에 REPEATABLE READ reader는 기존 snapshot의 102=2400과 103을 유지합니다. 결과 membership은 captured evidence이지만 화면에 표시되는 delete mark와 undo 연결은 Model 내용입니다.

근거 경계
Captured
Q-01 두 번째 read 결과 rows와 transaction 순서
Model
row-version chain과 undo 이동 표현
Checkpoint · evidence로 설명하기화면의 undo version 연결을 실제 engine 내부 pointer와 traversal capture로 보아도 되나요?답과 근거 확인

아닙니다. Q-01 결과와 transaction 순서는 captured evidence이지만 row version chain과 undo 이동은 fixture에 근거한 Model입니다. 내부 DB_TRX_ID나 DB_ROLL_PTR 값을 꾸며내지 않습니다.

근거 경계
Captured
Q-01 결과와 transaction 순서
Model
row-version chain과 undo 이동
이번 Lab의 핵심

MVCC의 핵심은 최신 row 하나가 아니라 각 statement의 read view가 어떤 committed version을 볼 수 있는지입니다.

다음 연결

다음 Lab에서는 일반 consistent read 대신 FOR UPDATE를 붙였을 때 record·gap·next-key lock과 wait가 어떻게 생기는지 비교합니다.

용어 확인
consistent read처음 다루는 Lab 07
transaction의 read view에 보이는 row version을 반환하는 MVCC 기반 일반 SELECT 읽기입니다.
REPEATABLE READ처음 다루는 Lab 07
같은 transaction의 consistent read가 하나의 snapshot을 재사용해 반복 조회 결과를 안정적으로 유지하는 isolation level입니다.
READ COMMITTED처음 다루는 Lab 07
각 consistent read가 statement 시작 시점의 새 snapshot을 사용하는 isolation level입니다.
undo record처음 다루는 Lab 07
변경 전 row 정보를 보관해 rollback과 snapshot에 맞는 이전 version 복원을 지원하는 InnoDB 기록입니다.

Current commandQ-01 definition
  1. A · RR readerRR reader · connection 12
    not-startedREPEATABLE READ
  2. B · RR writerWriter · connection 10
    not-startedREPEATABLE READ
  3. C · RC readerRC reader · connection 11
    not-startedREAD COMMITTED
  4. O · ObserverObserver · connection 13
    not-applicableREAD COMMITTED
01 · SOURCE

Q-01 reference

5 reference fragmentsMySQLQ-01 definition · secondary index · non-covering · ORDER BY
SELECT order_id, amount_cents, revision, note
FROM mvcc_orders FORCE INDEX (idx_tenant_state_order)
WHERE tenant_id = 7
  AND state = 'READY'
ORDER BY order_id;
02 · FLOW

Native plan과 actual iterator

01 / 16
Plan metricsReference metrics

Reference values, not metrics for Q-01 definition

cost
0.35
estimated rows
1
actual time · first row ms
0.0348
actual time · last row ms
0.0362
actual rows
4
loops
1
repeatable-read EXPLAIN FORMAT=TREE-> Index lookup on mvcc_orders using idx_tenant_state_order (tenant_id=7, state='READY') (cost=0.35 rows=1)
DATA PATH

Secondary entry, row version, visible result

Model + Captured
Model
not-creatednone
INDEX

Secondary index entries

Derived · fixture
tenant_idstateorder_id · PKorigin
7READY101seed
7READY102seed
7READY103seed
7READY105seed
7READY106writer-insert
PRIMARY

Clustered row versions

Derived · fixture
order_idversionamount_centsrevisionnoteorigin
101101-seed12001seed-101seed
102102-before24001seed-102seed
102102-after25002updated-by-bwriter-update
103103-before-delete36001seed-103seed
105105-seed60001seed-105seed
106106-inserted66001inserted-by-bwriter-insert

Visible Q-01 result

Captured

Q-01 result가 아직 없습니다

Transaction isolation
1 / 16