-
Why Q-01 reads both the secondary index and clustered rows
active command · Q-01 definition
Q-01 · reference-context · native plan · reference-context
The active command is Q-01 definition. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
tenant_id = 7 and state = 'READY' bind the first two key parts of idx_tenant_state_order. Entry 101 carries PK 101, while amount_cents=1200 comes from the clustered row because it is not in the index. The first row set is 101, 102, 103, 105.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-serverevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A begins a REPEATABLE READ read-only transaction
active command · A START TRANSACTION READ ONLY
Q-01 · reference-context · native plan · reference-context
The active command is A START TRANSACTION READ ONLY. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
A (connection 12) has run START TRANSACTION READ ONLY, but A1 has not run. Row 101 has amount_cents=1200 in the fixture; A has not established its first consistent-read boundary yet.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-connection-aevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C begins a READ COMMITTED read-only transaction
active command · C START TRANSACTION READ ONLY
Q-01 · reference-context · native plan · reference-context
The active command is C START TRANSACTION READ ONLY. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
C (connection 11) also runs START TRANSACTION READ ONLY. Before C1 there is no statement snapshot; row 102 currently has amount_cents=2400 and revision 1 in the fixture.
Model · not-created · none Visible result · not-run · 0 rows
evidence:mvcc-consistent-read-captured-connection-cevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A1 fixes the first row set for the RR transaction
active command · A1 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is A1 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
A1 returns 101=1200, 102=2400/revision 1, 103=3600, and 105=6000. Row IDs 101, 102, 103, 105 and old checksum 0f6e4ce02300c310ea47dee95ba35ac7e0a74a7dfc5851e4246235c65b5ff171 bind to A's first consistent-read boundary.
Model · first-read · transaction-snapshot-established - row 101 · 101-seed · no prior · visible-head · not-followed
- row 102 · 102-before · no prior · visible-head · not-followed
- row 103 · 103-before-delete · no prior · visible-head · not-followed
- row 105 · 105-seed · no prior · visible-head · not-followed
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-connections-readyevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
C1 also returns the pre-writer row set
active command · C1 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is C1 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
C1 returns 101=1200, 102=2400/revision 1, 103=3600, and 105=6000. The view pairs A's transaction snapshot with row IDs 101, 102, 103, 105.
Model · first-read · transaction-snapshot-established - row 101 · 101-seed · no prior · visible-head · not-followed
- row 102 · 102-before · no prior · visible-head · not-followed
- row 103 · 103-before-delete · no prior · visible-head · not-followed
- row 105 · 105-seed · no prior · visible-head · not-followed
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B updates the payload of row 102
active command · B UPDATE order_id=102
Q-01 · reference-context · native plan · reference-context
The active command is B UPDATE order_id=102. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
B changes row 102 from amount_cents=2400, revision 1, note=seed-102 to amount_cents=2500, revision 2, note=updated-by-b; affected rows=1. The version link from 102-after to 102-before appears in the Model band.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-connection-bevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-update-order102evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B inserts the new secondary entry for row 106
active command · B INSERT order_id=106
Q-01 · reference-context · native plan · reference-context
The active command is B INSERT order_id=106. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
INSERT creates row 106 with tenant_id=7, state=READY, amount_cents=6600, and revision 1; affected rows=1. Row 106 is absent from the A1 and C1 old row sets, which remain unchanged before the writer commits.
Model · first-read · transaction-snapshot-established - row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-insert-order106evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B deletes row 103
active command · B DELETE order_id=103
Q-01 · reference-context · native plan · reference-context
The active command is B DELETE order_id=103. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
DELETE reports affected rows=1 for row 103, whose prior payload is amount_cents=3600 and revision 1. The Model band connects the 103 delete mark to 103-before-delete while the A1/C1 results still retain row 103.
Model · first-read · transaction-snapshot-established - row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-reader-baseline-completeevidence:mvcc-consistent-read-captured-writer-delete-order103evidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
Hold B before COMMIT and inspect transactions with locks
active command · B transaction open
Q-01 · reference-context · native plan · reference-context
The active command is B transaction open. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
A=12, B=10, and C=11 are ACTIVE. B has 3 granted locks and 0 waiting locks; A/C grants and data_lock_waits edges are 0. The same view connects B's row 102=2500 update, row 103 delete, and row 106=6600 insert.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
- row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
- row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-connection-oevidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-writer-holdevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
B COMMIT changes what a fresh snapshot can see
active command · B COMMIT
Q-01 · reference-context · native plan · reference-context
The active command is B COMMIT. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
B COMMIT is acknowledged=true and the writer lock count closes to 0. A's existing snapshot retains row 102=2400; C's next statement can see committed row 102=2500 and row 106=6600.
Model · first-read · transaction-snapshot-established - row 102 · 102-after · 102-before · not-evaluated · not-evaluated
- row 103 · 103-delete-mark · 103-before-delete · not-evaluated · not-evaluated
- row 106 · 106-inserted · no prior · not-evaluated · not-evaluated
Visible result · first · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-baselineevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-captured-writer-commitevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A2 selects the prior version of row 102
active command · A2 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is A2 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
For row 102, A2 follows past the current 2500/revision 2 payload and selects the prior 2400/revision 1 payload. Captured A2 row IDs remain 101, 102, 103, 105 with the old checksum.
Model · reused · transaction-snapshot-reused - row 102 · 102-after · 102-before · visible-prior · followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A2 includes 103 and excludes 106
active command · A2 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is A2 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
A2's reused snapshot includes prior row 103=3600 and excludes new row 106=6600. Result IDs 101, 102, 103, 105 remain identical to A1.
Model · reused · transaction-snapshot-reused - row 103 · 103-delete-mark · 103-before-delete · visible-prior · followed
- row 106 · 106-inserted · no prior · not-visible · not-followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
A2 keeps the old payload after C2 runs
active command · C2 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is C2 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
C2 returns row 102=2500/revision 2, while A continues to display 102=2400/revision 1 from its reused snapshot. A2 row IDs 101, 102, 103, 105 do not change.
Model · reused · transaction-snapshot-reused - row 102 · 102-after · 102-before · visible-prior · followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-writer-commit-closedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
Compare C2 membership changes with A2's fixed row set
active command · C2 Q-01
Q-01 · execution-target · native plan · execution-target
The active command is C2 Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops remain reference metrics until plan-boundary.
C2 excludes row 103=3600 and includes row 106=6600, whereas A2 includes 103 and excludes 106. A2 retains 101, 102, 103, 105.
Model · reused · transaction-snapshot-reused - row 103 · 103-delete-mark · 103-before-delete · visible-prior · followed
- row 106 · 106-inserted · no prior · not-visible · not-followed
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-reader-second-reads-completeevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
The boundary exposed by native EXPLAIN
active command · A EXPLAIN ANALYZE Q-01
Q-01 · execution-target · native plan · execution-target
The active command is A EXPLAIN ANALYZE Q-01. Q-01 and its native iterator are the execution or analysis target in this phase. Actual time, rows, and loops belong to this EXPLAIN ANALYZE.
A's native plan records access type ref, key idx_tenant_state_order, cost 0.35, estimated rows 1, actual rows 4, and loops=1. Row 102 resolves to 2400/revision 1; no separate MVCC operator is added to the native plan.
Model · reused · transaction-snapshot-reused Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-plans-capturedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings
-
Keep the last A2 result after A COMMIT
active command · A COMMIT
Q-01 · reference-context · native plan · reference-context
The active command is A COMMIT. Q-01 is not executed in this phase. Its SQL span and native iterator remain reference context; actual time, rows, and loops are not metrics for the active command.
A is committed and its transaction state is closed, while the last Captured A2 result 101, 102, 103, 105 and row 102=2400/revision 1 remain visible.
Visible result · second · 4 rows
- 101 · 1200 · revision 1 · seed-101
- 102 · 2400 · revision 1 · seed-102
- 103 · 3600 · revision 1 · seed-103
- 105 · 6000 · revision 1 · seed-105
evidence:mvcc-consistent-read-captured-plan-aevidence:mvcc-consistent-read-captured-result-a-secondevidence:mvcc-consistent-read-captured-transaction-readers-committedevidence:mvcc-consistent-read-derived-plan-factsevidence:mvcc-consistent-read-derived-result-diffsevidence:mvcc-consistent-read-derived-result-digestsevidence:mvcc-consistent-read-derived-session-labelsevidence:mvcc-consistent-read-fixture-bindings