METHOD / VERSION / LIMITS
Know what the record proves.
The website is a reader for actual saved MySQL executions. A local runner creates evidence; a strict exporter publishes selected fields. No browser control starts a database.
Barriers and deadlock evidence
The coordinator waits for both first updates to return, submits A’s second update in its own worker, and polls data_lock_waits with a hard deadline. B’s second update is released only after a real A → B edge appears. Polling uses a short wait between observations; elapsed time never decides statement ordering.
The automatic deadlock detector stays enabled. Therefore the saved lock-table snapshot shows the wait before the cycle, not a frozen complete cycle. SHOW ENGINE INNODB STATUS, error 1213, transaction outcomes and final table values jointly establish the deadlock. The same-order control observes a real wait and both commits, distinguishing waiting from cyclic waiting.
Actual observer SQL
SELECT THREAD_ID, OBJECT_NAME, INDEX_NAME, LOCK_TYPE, LOCK_MODE, LOCK_STATUS, LOCK_DATA
FROM performance_schema.data_locks WHERE OBJECT_SCHEMA='mysql_lab'
ORDER BY OBJECT_NAME, THREAD_ID, LOCK_TYPE, LOCK_STATUSSELECT r.THREAD_ID AS waiting_thread, b.THREAD_ID AS blocking_thread,
r.OBJECT_NAME AS table_name, r.INDEX_NAME AS index_name, r.LOCK_MODE AS requested_mode,
b.LOCK_MODE AS held_mode, r.LOCK_DATA AS lock_data
FROM performance_schema.data_lock_waits w
JOIN performance_schema.data_locks r ON r.ENGINE_LOCK_ID=w.REQUESTING_ENGINE_LOCK_ID
JOIN performance_schema.data_locks b ON b.ENGINE_LOCK_ID=w.BLOCKING_ENGINE_LOCK_ID
WHERE r.OBJECT_SCHEMA='mysql_lab' ORDER BY table_name, waiting_threadRead views and locking reads
Explicit transactions, InnoDB, an existing unique primary-key row and no writes by reader A. The first ordinary SELECT establishes A’s snapshot. Under READ COMMITTED, each ordinary read can observe B’s committed 200; under REPEATABLE READ, ordinary reads retain 100. SELECT FOR UPDATE observes current committed 200 in both and holds a row lock that blocks B’s later writer.
This does not test ranges, missing keys, gap locks, phantom inserts, own writes, UPDATE read behavior, autocommit locking reads, or other isolation levels. Do not apply this result to every statement.
Seeded data and timing protocol
Python Random seed 20261113 generates 60,000 rows: 64 uniformly sampled tenants, status weights 7:2:1, dates uniformly sampled over 365 days in 2026, synthetic payload and integer cents. The full generated-row SHA-256 is recorded. ANALYZE TABLE updates statistics before each index condition.
Each query has one untimed warm-up and seven measured client executions including fetch, followed by separate EXPLAIN FORMAT=JSON and EXPLAIN ANALYZE executions. The latter executes SQL and reports server iterator timings/row counts. All seven result hashes must match. The noncovering pair and covering rewrite pair must each have equal result hashes.
No cold-cache test, concurrency load test, randomized ordering, capacity estimate or production recommendation is claimed. Timings include local client/network overhead and are sensitive to buffer state, virtualization, hardware and optimizer statistics. Seven samples make p95 coarse.
Provenance and source boundary
{
"version": "8.4.13",
"arch": "aarch64",
"buffer_pool_bytes": 134217728,
"deadlock_detect": 1,
"performance_schema": 1,
"driver": "PyMySQL 1.1.2",
"python": "3.11.2",
"runtime": "Docker / Linux ARM64",
"image": "mysql:8.4.13@sha256:a81d043930e51745522bd5c430961cf8286f0a23f0a9a2a6e0108f7ea71b0902",
"mysql_memory_limit_mib": 1024,
"mysql_cpu_limit": 2
}The first record came from a fresh named volume; the repeat followed stop/start with the same volume. Semantic assertions and dataset hashes match; transaction victim, lock order in snapshots, estimates and timings can vary. Raw host/connection lines, passwords, paths and memory-address lock IDs are excluded from the public JSON. Session thread IDs become A/B labels.
The MIT companion contains synthetic SQL, orchestration, tests and sanitized records so learners can download, develop and debug it. The complete homepage source remains private. This site does not collect files, connect to a public database or call paid models.