跳至正文
Lynn LeeMYSQL / LEARNING LAB

METHOD / VERSION / LIMITS

明确证据能说明什么。

网页用于阅读实际保存的 MySQL 执行。本地运行器采集证据,严格导出器只发布选定字段。网页控件不会启动数据库。

屏障与死锁证据

编排器等待两边首次更新完成,在独立工作线程提交 A 的第二条更新,并在硬截止时间内轮询 data_lock_waits。真实 A → B 边出现后,才放行 B 的第二条更新。两次观测之间短暂等待,但经过时间从不决定语句顺序。

自动死锁检测保持开启。因此锁表快照显示成环前的等待,不是冻结的完整环。SHOW ENGINE INNODB STATUS、1213 错误、事务结果和表终值共同证明死锁。同顺序对照观察真实等待与双方提交,区分等待和环形等待。

观察者的实际 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_STATUS
SELECT 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_thread

读视图与锁定读

前提是显式事务、InnoDB、已存在的唯一主键行,且读取方 A 不写入。首次普通 SELECT 建立 A 的读视图。READ COMMITTED 的后续普通读可看到 B 已提交的 200;REPEATABLE READ 的普通读保留 100。SELECT FOR UPDATE 在两者下都读取当前已提交的 200,并持有阻塞 B 后续写入的行锁。

这里不检验范围、缺失键、间隙锁、幻影插入、自身写入、UPDATE 的读取行为、自动提交锁定读及其他隔离级别。不要将观察推广到所有语句。

固定数据与耗时协议

Python Random 种子 20261113 生成 60,000 行:64 个均匀抽样租户,状态权重 7:2:1,2026 年 365 天均匀抽样日期、合成载荷及整数分金额。记录完整生成行的 SHA-256。每种索引条件前执行 ANALYZE TABLE 更新统计。

每条查询先进行 1 次不计时预热、7 次包含取回结果的客户端实测,再独立执行 EXPLAIN FORMAT=JSON 与 EXPLAIN ANALYZE。后者会执行 SQL,报告服务端迭代器耗时/行数。7 次结果哈希必须一致,非覆盖比较组与覆盖改写组各自的结果哈希也必须一致。

不声称完成冷缓存测试、并发负载测试、随机顺序实验、容量估计或生产建议。耗时包括本地客户端/网络开销,并受缓冲池、虚拟化、硬件及优化器统计影响。仅 7 个样本,p95 粒度较粗。

来源与源码边界

{
  "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
}

首份记录来自全新命名卷;复跑在同一卷停止/重启后执行。语义断言和数据集哈希一致;回滚对象、快照锁顺序、估计与耗时允许变化。公开 JSON 不含原始主机/连接行、密码、路径和内存地址形式的锁 ID,线程 ID 映射为 A/B。

MIT 配套仓库仅包含合成 SQL、编排器、测试及筛选记录,供学习者下载、开发、调试。主页整体源码保持私有。本站不收集文件、不连接公开数据库、不调用付费模型。

官方参考

机器可读验收与记录哈希 ↗