LEARNING ROUTE / VERIFIED 2026-11-14
Read. Predict. Run. Explain.
Two university courses, six original exercises, one real InnoDB engine. Start with the invariant, then connect general DBMS principles to measured MySQL behavior.
The selected Spring 2026 courses and PDFs were checked on November 14, 2026. We link to the originals and do not redistribute their content or publish university assignment answers. These are current offerings of long-established DBMS ideas, not claims that transactions or MVCC were invented in 2026.
Download searchable resource catalog JSON · Unauthenticated link checks & hashes
Search also works offline: python scripts/curriculum.py MVCC. Your query stays in this page.
Carnegie Mellon University
15-445/645 · Intro to Database Systems
Spring 2026 · verified 2026-11-14
Prerequisites:Official syllabus: CMU 15-213/513; C++17 programming. Lab adaptation: SQL, Python, transactions and basic indexes; no BusTub implementation required.
Public reading:Schedule, selected linked lecture notes were readable without login. Textbook chapter references are reading pointers, not a claim that the complete textbook is freely licensed. No course content is redistributed here.
Enrollment / costs:Public reading does not provide CMU registration, credit, staff support or Gradescope access. Institutional enrollment and its costs are separate; no fee or free-credit claim is made.
Massachusetts Institute of Technology
6.5830/6.5831 (formerly 6.814/6.830) · Database Systems
Spring 2026 · verified 2026-11-14
Prerequisites:Spring 2026 syllabus expects 6.1210 (formerly 6.006) or equivalent algorithms, computer systems familiarity (e.g. 6.1800/formerly 6.033), and software debugging ability. Prior databases are not required; course labs use Go.
Public reading:Syllabus, schedule, assigned-reading pages and selected lecture PDFs were readable without login. Recordings and third-party readings may have separate access conditions and are not promised here.
Enrollment / costs:MIT registration, graded submissions, staff support and credit are separate from public reading; enrollment may be limited. University lab/problem-set solutions must not be made public. This companion implements none of those assignments.
U1 / State the invariant before choosing isolation
- #17 Concurrency Control Theory
Mar 23; lecture notes sections 2, 5–6 (transactions, consistency, serial schedules) - Lec 11 Transactions and Locking
Mar 17; PDF pages 36–48: 2PL, waits-for graphs and strict/rigorous locking
Predict:Enumerate both serial withdrawal orders. Can (0,0) occur if each request leaves at least one doctor?
python -c 'from scripts.invariant_oracle import serial_outcomes; print(serial_outcomes())'
python lab.py oncall --output .local/u1/oncall.jsonInspect / explain:Compare independently enumerated terminal states (0,1)/(1,0) with observer-read final_rows and oracle in every measured case.
The oracle models two fixed doctors and two requests, not arbitrary SQL serializability. This is an original Lab exercise, not a CMU/MIT assignment.
U2 / Separate a wait from a deadlock
- #18 Two-Phase Locking
Mar 25; lecture notes sections 1–3 (locks, 2PL, deadlock handling) - Lec 11 Transactions and Locking
Mar 17; PDF pages 36–48: 2PL, waits-for graphs and strict/rigorous locking
Predict:Which second UPDATE creates the cycle? Must the same-order control also wait?
python lab.py run --output .local/u2/run.json
python scripts/validate.py .local/u2/run.jsonInspect / explain:Real data_lock_waits edge, matching waiting/granted locks, 1213 victim and final values; ordered control commits twice.
The detector resolves a complete cycle immediately. The before-cycle snapshot alone does not prove the entire cycle; use the deadlock excerpt too.
U3 / Predict snapshot and current reads
- #20 Multi-Version Concurrency Control I
Apr 1; lecture notes, multi-version storage and snapshots; schedule reading Chapter 18.7–18.8 - Lec 12 Optimistic Concurrency Control, Snapshot Isolation
Mar 19; lecture slides; compare snapshot theory with InnoDB's plain and locking reads - MySQL 8.4: Consistent Nonlocking Reads
Reference Manual 17.7.2.3; RC statement snapshots and RR first consistent read
Predict:Under RR, does FOR UPDATE refresh the next plain SELECT? Predict all four reads before running.
python lab.py run --output .local/u3/run.json
python scripts/validate.py .local/u3/run.jsonInspect / explain:RC 100/200/200/200 and RR 100/100/200/100; the following writer has a measured lock wait.
General MVCC concepts explain multiple versions; InnoDB statement behavior must be checked separately. RR is not a synonym for serializable.
U4 / Repair write skew and test a flawed repair
- #17 Concurrency Control Theory
Mar 23; lecture notes sections 2, 5–6 (transactions, consistency, serial schedules) - Lec 12 Optimistic Concurrency Control, Snapshot Isolation
Mar 19; lecture slides; compare snapshot theory with InnoDB's plain and locking reads - MySQL 8.4: Consistent Nonlocking Reads
Reference Manual 17.7.2.3; RC statement snapshots and RR first consistent read - MySQL 8.4: Locking Reads
Reference Manual 17.7.2.4; explicit transaction and SELECT FOR UPDATE
Predict:If both sessions establish a snapshot before taking the same guard row with FOR UPDATE, will serialization of the guard fix RR? What changes under RC?
python lab.py oncall --output .local/u4/oncall.json
cp sql/oncall.json .local/u4/sql.json
python lab.py oncall --sql-file .local/u4/sql.json --output .local/u4/edited.jsonInspect / explain:Both commit in all cases. Compare unguarded, late_guard and guard_first with independent final state, read barriers and real B→A guard wait.
Every writer must follow the guard protocol; guard-first RR requires no earlier consistent read. No claim about arbitrary pre-existing transactions, inserts, deletes or throughput.
U5 / Lock the data used for a decision
- #18 Two-Phase Locking
Mar 25; lecture notes sections 1–3 (locks, 2PL, deadlock handling) - MySQL 8.4: Locking Reads
Reference Manual 17.7.2.4; explicit transaction and SELECT FOR UPDATE
Predict:Why can a locking roster read see one remaining doctor even after waiting? Is a row-local AND on_call=1 condition enough to protect a cross-row count?
python lab.py oncall --output .local/u5/oncall.json
python scripts/validate_oncall.py .local/u5/oncall.jsonInspect / explain:The follower's completed locking read returns one row; only one withdrawal occurs. The unguarded conditional updates still remove both doctors.
Fixed membership and a single shift only. Observed lock modes are recorded, not prescribed; this is not a phantom/range-insert proof. Guard rows serialize cooperating writers at the cost of contention.
U6 / Use an index without changing the answer
- #08 Indexes & Filters I
Feb 9; lecture notes on B+ trees; schedule reading Chapter 14.1–14.4 - #15 Query Planning & Optimization I
Mar 16; lecture notes sections 2–8 (equivalence, rewrites, cost, access paths) - MySQL 8.4: EXPLAIN
Reference Manual 15.8.2; EXPLAIN ANALYZE executes the statement
Predict:Which predicates narrow an index scan? Why compare result hashes only for matching projections?
python lab.py run --output .local/u6/run.json
python scripts/validate.py .local/u6/run.jsonInspect / explain:Complete returned rows, equal hashes within each pair, JSON plans and actual iterator rows. Seven fetch samples describe one warm-buffer run.
A plan estimate is not an actual row count, and an index is not guaranteed faster. No randomized crossover, cold-cache or production-capacity conclusion.
2026 publication status
CMU Fall 2026 is real and its schedule was updated November 11. The November 16 MVCC lecture is still future-dated at this check and has no linked notes/slides. We use the completed Spring edition. Later publication is unknown here. Official Fall schedule