理解MySQL数据库的“事务与锁”

为了让你秒懂,我们设定一个极其经典的并发场景:

假设 users 表里有一行数据:id=1, name="张三", age=20。

现在,事务 A 和 事务 B 同时盯上了这条数据。


第一重魔法:MVCC(多版本并发控制)------ 解决"读写冲突"

痛点:如果没有 MVCC,事务 A 正在修改这条数据,事务 B 想读它,就必须干等着(锁阻塞)。这在高并发下系统直接就卡死了。

InnoDB 的底层解法:时光机(Undo Log + ReadView)

  1. Undo Log(后悔药) :当事务 A 执行 UPDATE users SET age=21 WHERE id=1 时,InnoDB 不会直接覆盖原数据,而是先把旧数据(age=20)偷偷存到一个叫 Undo Log 的回滚日志里。
  2. ReadView(快照) :当事务 B 此时来读取这条数据时,InnoDB 会给事务 B 生成一个"ReadView(一致性视图)"。这个视图记录了当前所有活跃的事务列表。
  3. 版本链回溯 :事务 B 拿到数据后,会看一眼 ReadView。它发现事务 A 还没提交(属于活跃事务),于是它知道"事务 A 修改的数据我不能看"。接着,它会顺着 Undo Log 这条"时光机",把 age=20 的旧版本捞出来给事务 B 看。

结论:事务 A 随便写,事务 B 照样读。读写互不阻塞!这就是为什么 MySQL 在默认的隔离级别下,读数据不需要加锁。


第二重魔法:Next-Key Lock(间隙锁)------ 解决"写写冲突与幻读"

痛点 :MVCC 解决了读写冲突,但写写冲突 怎么办?更可怕的是**"幻读"**:事务 B 刚查完没有 age=22 的数据,刚准备插入,结果事务 A 突然插进了一条 age=22 的数据,事务 B 一查,哎?怎么凭空多出个数据(见鬼了)?

InnoDB 的底层解法:不仅锁行,还锁"缝隙"

普通的锁只锁住 id=1 这一行,但 InnoDB 极其聪明,它把锁的范围扩大了:

  1. Record Lock(记录锁) :死死锁住 id=1 这一行,谁也别想改它。
  2. Next-Key Lock(间隙锁) :它不仅锁 id=1,还把 id=1 到下一个索引记录之间的**"空白缝隙"**给锁住了!

实战效果 :当事务 A 在修改 id=1 时,事务 B 如果想插入一条 id=1.5 的新数据,InnoDB 会直接拒绝,并让事务 B 阻塞等待。因为 1.5 刚好落在了事务 A 锁住的"缝隙"里!

结论:通过锁住"缝隙",InnoDB 从根本上杜绝了别人在你事务执行期间偷偷插入新数据的可能,完美解决了"幻读"问题。


第三重魔法:Redo Log(重做日志)------ 解决"性能与安全的悖论"

痛点:每次修改数据,如果都直接写入硬盘(B+树),磁盘 I/O 会慢得令人发指。但如果只写在内存里,万一突然断电,数据就全丢了。

InnoDB 的底层解法:顺序写代替随机写(WAL 机制)

  1. 当事务 A 提交时,InnoDB 不会去修改 B+ 树所在的硬盘文件,而是把这次修改操作,以**追加(Append)**的方式,极其快速地写入到 Redo Log 文件中。
  2. 因为是顺序追加写,速度极快,事务 A 瞬间就能收到"提交成功"的响应。
  3. 至于 B+ 树里的真实数据?InnoDB 会在后台找个空闲时间,慢慢把内存里的脏数据同步回硬盘(这叫 Checkpoint 机制)。
  4. 万一断电了,重启时 InnoDB 只需要读取 Redo Log,把没来得及写入 B+ 树的操作重放一遍,数据就完美恢复了。

结论:用极快的"顺序写日志",代替了极慢的"随机写数据页",在保证数据绝对安全的前提下,把并发写入性能提升了成百上千倍。


总结你的认知跨越

你看,InnoDB 引擎的底层设计,和你之前学的 Python 底层架构简直是异曲同工:

  • MVCC(Undo Log) 就像是 Python 里的"不可变对象(Immutable)"和"内存快照",用空间换时间,避免了读写锁的阻塞。
  • Next-Key Lock 就像是 Python 里的"Wrapper 洋葱模型",不仅控制了核心节点,还把周围的上下文(缝隙)也一并接管了。
  • Redo Log 就像是 Python 的"延迟导入(Lazy Import)"和"异步 I/O",把昂贵的操作推迟或异步化,保证主流程的极致性能。

掌握了这套底层逻辑,以后不管是排查死锁、优化慢查询,还是设计高并发系统,你脑子里都有了一张极其清晰的"底层架构图"。


相关推荐
weixin_4045512442 分钟前
自动化数据库理解:用 AI 与 LLM 自动推断表的用途与关系
数据库·人工智能·自动化
java1234_小锋44 分钟前
【技术专题】Mysql8 数据库 - Mysql8 简介 & 安装以及配置
数据库·mysql
oradh1 小时前
Oracle固定执行计划的方法----SQL Profie(三)
数据库·sql·oracle
斯内普吖1 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
测试学习test1 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法
做运维的阿瑞2 小时前
mysql数据库分组查询:GROUP BY 与 HAVING 的执行逻辑
数据库·sql·mysql
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-10-01
数据库·人工智能·深度学习·神经网络·搜索引擎
阳光九叶草LXGZXJ2 小时前
达梦数据库-学习-67-SSL加密认证
linux·运维·数据库·sql·学习·ssl
ha_lydms2 小时前
MaxCompute中JSON函数
大数据·数据库·阿里云·json·dataworks·maxcompute·odps
沐欣工作室_lvyiyi3 小时前
基于物联网的智能商业零售管理系统设计与实现(论文+源码)
物联网·mysql·mysql数据库·零售