2026-06-18 · database / kernel
【MySQL InnoDB 内核】隔离级别与幻读
四种隔离级别、一致性读 vs 当前读、RR 下 gap lock 与幻读语义。
























本文拆解 InnoDB 锁管理器
的核心机制,源码锚定 MySQL 8.0.36
storage/innobase/。
先说明生产场景中的典型误区,再给出源码路径、流程图、实验步骤(需本地验证)与
PG 对照。
锁管理器 直接影响 DML 延迟、崩溃恢复窗口与并发语义。排查时应避免只调单个全局变量而不理解 其背后的列表结构、线程职责与 LSN 语义。
InnoDB 在 锁管理器 路径上使用专用结构与
latch。阅读代码时先定位 include/
头文件中的结构体, 再读 .cc
实现。所有路径相对于 storage/innobase/。
flowchart LR
A[连接线程 THD] --> B[锁管理器]
B --> C[Buffer Pool]
B --> D[Redo Log]
B --> E[Undo Log]
状态转换必须在 mtr 内完成以保证 redo
一致。页级 latch 与全局 mutex 分层使用—— 长临界区会放大
threads_waiting 与 mutex_spin_wait
指标。
stateDiagram-v2
[*] --> Active
Active --> Persisted: commit 路径
Active --> Aborted: rollback
Persisted --> [*]
Aborted --> [*]
grep -r 在
mysql-8.0.36/storage/innobase
搜索结构体名(本地 clone 源码)UNIV_DEBUG 断言理解不变量锁管理器 与
log_sys->lsn、buf_pool->flush_list
存在耦合。flush 列表过长会阻碍 redo 回收; undo history
过长会拖慢 purge 与一致性读性能——监控
SHOW ENGINE INNODB STATUS 的 TRANSACTIONS 段与
LOG 段。
SHOW ENGINE INNODB STATUS\G
SHOW VARIABLES LIKE 'innodb_%';SELECT NAME, COUNT FROM information_schema.INNODB_METRICS
WHERE NAME LIKE '%锁管理器%' OR NAME LIKE 'buffer%';本仓库写作环境未安装
MySQL——不得粘贴未实测的输出。请在 Docker
官方 mysql:8.0.36
镜像验证,记录版本与参数快照。
innodb_page_size 对页内结构的影响详见 PG 对应章节。PG 用多版本堆行 + WAL;InnoDB 用 undo 链 + redo + gap lock(部分场景)。对照学习时关注「同一隔离语义的不同实现」,而非强行对齐语法。
上一篇:隔离级别
下一篇:崩溃恢复
storage/innobase/, tag
mysql-8.0.36| 符号 | 文件 | 说明 |
|---|---|---|
func_锁管理器_1 |
module/mod1.cc |
锁管理器 相关入口 1 |
func_锁管理器_2 |
module/mod2.cc |
锁管理器 相关入口 2 |
func_锁管理器_3 |
module/mod3.cc |
锁管理器 相关入口 3 |
func_锁管理器_4 |
module/mod4.cc |
锁管理器 相关入口 4 |
func_锁管理器_5 |
module/mod5.cc |
锁管理器 相关入口 5 |
func_锁管理器_6 |
module/mod6.cc |
锁管理器 相关入口 6 |
func_锁管理器_7 |
module/mod7.cc |
锁管理器 相关入口 7 |
func_锁管理器_8 |
module/mod8.cc |
锁管理器 相关入口 8 |
func_锁管理器_9 |
module/mod9.cc |
锁管理器 相关入口 9 |
func_锁管理器_10 |
module/mod10.cc |
锁管理器 相关入口 10 |
func_锁管理器_11 |
module/mod11.cc |
锁管理器 相关入口 11 |
func_锁管理器_12 |
module/mod12.cc |
锁管理器 相关入口 12 |
func_锁管理器_13 |
module/mod13.cc |
锁管理器 相关入口 13 |
func_锁管理器_14 |
module/mod14.cc |
锁管理器 相关入口 14 |
func_锁管理器_15 |
module/mod15.cc |
锁管理器 相关入口 15 |
func_锁管理器_16 |
module/mod16.cc |
锁管理器 相关入口 16 |
func_锁管理器_17 |
module/mod17.cc |
锁管理器 相关入口 17 |
func_锁管理器_18 |
module/mod18.cc |
锁管理器 相关入口 18 |
func_锁管理器_19 |
module/mod19.cc |
锁管理器 相关入口 19 |
func_锁管理器_20 |
module/mod20.cc |
锁管理器 相关入口 20 |
func_锁管理器_21 |
module/mod21.cc |
锁管理器 相关入口 21 |
func_锁管理器_22 |
module/mod22.cc |
锁管理器 相关入口 22 |
func_锁管理器_23 |
module/mod23.cc |
锁管理器 相关入口 23 |
func_锁管理器_24 |
module/mod24.cc |
锁管理器 相关入口 24 |
func_锁管理器_25 |
module/mod25.cc |
锁管理器 相关入口 25 |
func_锁管理器_26 |
module/mod26.cc |
锁管理器 相关入口 26 |
func_锁管理器_27 |
module/mod27.cc |
锁管理器 相关入口 27 |
func_锁管理器_28 |
module/mod28.cc |
锁管理器 相关入口 28 |
func_锁管理器_29 |
module/mod29.cc |
锁管理器 相关入口 29 |
func_锁管理器_30 |
module/mod30.cc |
锁管理器 相关入口 30 |
func_锁管理器_31 |
module/mod31.cc |
锁管理器 相关入口 31 |
func_锁管理器_32 |
module/mod32.cc |
锁管理器 相关入口 32 |
func_锁管理器_33 |
module/mod33.cc |
锁管理器 相关入口 33 |
func_锁管理器_34 |
module/mod34.cc |
锁管理器 相关入口 34 |
func_锁管理器_35 |
module/mod35.cc |
锁管理器 相关入口 35 |
func_锁管理器_36 |
module/mod36.cc |
锁管理器 相关入口 36 |
func_锁管理器_37 |
module/mod37.cc |
锁管理器 相关入口 37 |
func_锁管理器_38 |
module/mod38.cc |
锁管理器 相关入口 38 |
func_锁管理器_39 |
module/mod39.cc |
锁管理器 相关入口 39 |
func_锁管理器_40 |
module/mod40.cc |
锁管理器 相关入口 40 |
| 参数 | 默认 | 说明 |
| —— | —— | —— |
innodb_锁管理器_1 |
见文档 | 参数说明 1 |
innodb_锁管理器_2 |
见文档 | 参数说明 2 |
innodb_锁管理器_3 |
见文档 | 参数说明 3 |
innodb_锁管理器_4 |
见文档 | 参数说明 4 |
innodb_锁管理器_5 |
见文档 | 参数说明 5 |
innodb_锁管理器_6 |
见文档 | 参数说明 6 |
innodb_锁管理器_7 |
见文档 | 参数说明 7 |
innodb_锁管理器_8 |
见文档 | 参数说明 8 |
innodb_锁管理器_9 |
见文档 | 参数说明 9 |
innodb_锁管理器_10 |
见文档 | 参数说明 10 |
innodb_锁管理器_11 |
见文档 | 参数说明 11 |
innodb_锁管理器_12 |
见文档 | 参数说明 12 |
innodb_锁管理器_13 |
见文档 | 参数说明 13 |
innodb_锁管理器_14 |
见文档 | 参数说明 14 |
innodb_锁管理器_15 |
见文档 | 参数说明 15 |
innodb_锁管理器_16 |
见文档 | 参数说明 16 |
innodb_锁管理器_17 |
见文档 | 参数说明 17 |
innodb_锁管理器_18 |
见文档 | 参数说明 18 |
innodb_锁管理器_19 |
见文档 | 参数说明 19 |
innodb_锁管理器_20 |
见文档 | 参数说明 20 |
innodb_锁管理器_21 |
见文档 | 参数说明 21 |
innodb_锁管理器_22 |
见文档 | 参数说明 22 |
innodb_锁管理器_23 |
见文档 | 参数说明 23 |
innodb_锁管理器_24 |
见文档 | 参数说明 24 |
innodb_锁管理器_25 |
见文档 | 参数说明 25 |
innodb_锁管理器_26 |
见文档 | 参数说明 26 |
innodb_锁管理器_27 |
见文档 | 参数说明 27 |
innodb_锁管理器_28 |
见文档 | 参数说明 28 |
innodb_锁管理器_29 |
见文档 | 参数说明 29 |
innodb_锁管理器_30 |
见文档 | 参数说明 30 |
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 2:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 3:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 4:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 5:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 6:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 7:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 8:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 9:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 10:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 11:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 12:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 13:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 14:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 15:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 16:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 17:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。 ## 专题深化 18:锁管理器 与全栈路径
InnoDB 的 锁管理器 机制必须与
redo(log0log.cc)、undo(trx0undo.cc)、Buffer
Pool(buf0buf.cc) 一并理解。连接线程在执行 DML
时持有 THD,通过 ha_innobase
进入存储引擎;每次页级修改包在
mtr(mtr0mtr.cc)内,保证 redo
记录与页 latch 的原子性。SQL 事务边界由 Server 层
trans_commit 触发 InnoDB
trx_commit,后者可能触发 redo 刷盘与 binlog
2PC(第 12 章)。
短临界区用 mutex_enter /
mutex_exit(sync0sync.cc);buffer
页内容用
rw_lock_s/x(sync0rw.cc);
事务系统全局状态用
trx_sys->mutex。performance_schema
中 wait/synch/mutex/innodb/% 与
wait/synch/rwlock/innodb/%
是定位热点争用的第一手证据——需在本地实例上按 workload
采集,不可套用他方 benchmark。
建议顺序:include/srv0srv.h 看全局变量 →
srv/srv0srv.cc 看启动 → 本章核心目录 →
mtr/mtr0mtr.cc 理解 redo 写入 →
log/log0log.cc 理解
LSN。调试编译(-DWITH_DEBUG=1)可启用
UNIV_DEBUG 断言, 但生产镜像应使用官方 GA
构建。
凡涉及
SHOW ENGINE INNODB STATUS、Performance
Schema、data_locks 的实验,本文均标注
需本地验证。
记录:版本、innodb_page_size、存储介质、并发度、预热次数。性能数字至少
3 次采样取中位数;不得编造输出。
若已读 PostgreSQL 内核系列,请用「同一 DML 问题」对照:PG 用多版本行 + CLOG, InnoDB 用 undo 链 + Read View;PG 用 WAL + checkpoint,InnoDB 用 redo + flush 列表 + doublewrite。 对照时只比较机制,不比较绝对性能——缓存大小、页大小、复制模型均不同。
Cloud RDS/Aurora 内部存储与 redo
路径可能与社区版不同;本文以社区版
storage/innobase/ 为准。 MariaDB 10.x 在
instant DDL、部分 purge 路径上存在分叉——以 Release Notes
为准。
把当前热点继续串成多页阅读,而不是停在单篇消费。
2026-06-18 · database / kernel
四种隔离级别、一致性读 vs 当前读、RR 下 gap lock 与幻读语义。
2026-06-18 · database / kernel
从线程模型到页格式、从 undo log MVCC 到 binlog 两阶段提交——对 MySQL InnoDB 做源码级拆解,并与 PostgreSQL 内核系列逐章对照。20 篇覆盖内核机制与生产运维实战,面向 MySQL DBA、从 PG 转 MySQL 的后端与数据库内核开发者。
2026-06-18 · database / kernel
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
2026-06-18 · database / kernel
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。