当前位置: 首页 > news >正文

我现在能理解mvcc让读不阻塞,但是无法理解mvcc让写不阻塞??

文章目录

      • 1. 核心纠正:MVCC 的边界
      • 2. 为什么你会产生“写不阻塞”的错觉?
        • 场景对比:
      • 3. “写-写”是如何阻塞的?(当前读)
      • 4. 只有一种情况,写看起来像“不阻塞”
      • 总结:面试怎么说?
      • 💡 进阶延伸

在传统的 MySQL InnoDB 实现中,MVCC 并没有解决“写-写”冲突,它只解决了“读-写”冲突。

如果两个事务同时尝试修改同一行数据,它们依然会互相阻塞。让我们把这个容易产生误解的概念拆开来看,彻底帮你打通任督二脉。


1. 核心纠正:MVCC 的边界

在面试或技术讨论中,一定要明确这个边界:

  • 读-读:不阻塞(天然支持)。
  • 读-写:不阻塞(这是 MVCC 的核心功劳,通过 Undo Log 快照实现)。
  • 写-写:依然阻塞(MVCC 并不处理这个,靠的是行锁 / 锁机制)。

所以,如果你觉得“写不应该被阻塞”,那其实是一个误区。数据库必须保证原子性和一致性,如果两个写操作同时修改同一行而不阻塞,就会发生“覆盖更新(Lost Update)”灾难。


2. 为什么你会产生“写不阻塞”的错觉?

可能是因为你在看文档时,看到了类似“MVCC 提升了写的并发性”这样的话。这其实指的是:写操作不再被读操作阻塞。

场景对比:
  • 没有 MVCC(全是锁):事务 A 正在读某行,加了读锁(S 锁)。事务 B 想改这行,必须等 A 读完释放锁。这时候写被读阻塞了
  • 有了 MVCC:事务 A 正在读(快照读)。事务 B 想改这行,直接去修改最新版本并加行锁。B 不需要管 A 在干什么,因为 A 读的是 Undo Log 里的历史版本。这时候写不被读阻塞

3. “写-写”是如何阻塞的?(当前读)

当你执行UPDATEDELETE或者INSERT时,InnoDB 执行的是当前读(Current Read)

  1. 取号:事务尝试修改某行。
  2. 加锁:它必须先获取该行的X 锁(排他锁)
  3. 冲突:如果另一个事务已经持有了这一行的 X 锁,当前的事务就必须进入lock wait状态。
  4. MVCC 在哪?此时 MVCC 只是在后台默默地为被修改的数据生成 Undo Log 版本,好让那些“只读不改”的事务能看到旧数据。

4. 只有一种情况,写看起来像“不阻塞”

那就是在分布式数据库或者某些特定的存储引擎(如乐观锁机制的 NoSQL)中,采用的是CAS(Check-And-Set)或者写时拷贝(Copy-on-Write)

但在 MySQL 的 InnoDB 里,写操作必须老老实实排队加锁。


总结:面试怎么说?

如果面试官问:“MVCC 是不是让读写都不阻塞了?”

你可以这样优雅地回答:

“准确来说,MVCC 实现了读-写的非阻塞。它通过版本链让读操作(快照读)不需要等待写操作释放锁。但是,写-写操作之间依然是阻塞的。InnoDB 仍然需要通过行锁(Record Lock)来保证多个事务同时修改同一行数据时的一致性。

所以 MVCC 的本质是**‘让读不被写阻塞’**,而不是‘让写不被写阻塞’。”


💡 进阶延伸

如果你在研究SeataAT 模式(你简历里提到的),你会发现它在分布式事务里实现了一套自己的“全局锁”,那其实也是在解决“写-写”冲突,防止脏写。

理解了这一点,你觉得在RR(可重复读)隔离级别下,如果一个事务先SELECT了一行,然后另一个事务把它删了并提交,第一个事务再去UPDATE这行会发生什么?

http://www.jsqmd.com/news/705056/

相关文章:

  • EPIC-ADS7-PUC嵌入式系统:工业级性能与实时控制解析
  • 风控命中日志和决策日志怎么设计 别只讲概念,真正容易出问题的是链路、状态和治理
  • FanControl中文设置完全指南:5分钟让Windows风扇控制说中文
  • 如何快速搭建个人电视服务器:Tvheadend完整指南
  • WASM容器化部署为何在边缘失效?——资深SRE团队压测237个场景后的真实结论
  • 2026年Hermes Agent/OpenClaw如何部署?快速部署流程
  • ARM可信启动机制与安全实践解析
  • BrowserOS:基于AI智能体的开源浏览器自动化平台实战指南
  • 如何用录播姬BililiveRecorder实现专业级直播录制与修复
  • 如何用Win11Debloat给你的Windows系统做一次彻底的数字排毒 [特殊字符]
  • springboot基于Vue3的足球迷球圈网站内容文章更新系统的设计与实现
  • NetBox-Agent:自动化同步服务器硬件与网络信息至NetBox的实战指南
  • Claude Code终极指南:从原理到实践,构建安全高效的AI编程工作流
  • VS Code Copilot Next 智能工作流搭建全指南(企业级CI/CD+Git+Debug闭环配置大揭秘)
  • 2026年OpenClaw/Hermes Agent怎么部署?新手图文教程
  • 基于微信小程序的公考学习平台的设计与实现pf(文档+源码)_kaic
  • R语言环境配置与高效编程实战指南
  • 明日方舟MAA助手终极指南:如何用智能自动化解放你的游戏时间
  • BepInEx完整指南:3分钟学会Unity游戏插件框架安装与配置
  • springboot基于微信小程序厦门周边游平台
  • VS Code中启用MCP后CPU飙升300%?独家性能剖析:Node.js IPC瓶颈定位、消息批处理优化与Worker线程迁移方案
  • 变分量子算法测量成本优化与TreeVQA框架解析
  • NEXCOM DFA 1163 uCPE设备解析:5G边缘计算与网络融合方案
  • MCP 2026日志分析增强使用手册(内部泄露版):含7个未公开CLI调试指令、5类隐藏诊断模式及Grafana 11.0原生集成密钥
  • MCP 2026金融审计配置强制升级倒计时(2025年3月1日生效):3类机构正紧急重构配置基线
  • 2026届学术党必备的六大AI辅助论文工具横评
  • GHelper:华硕笔记本性能优化的革命性轻量级控制工具深度评测
  • VS Code Copilot Next 架构设计图生成术(仅限首批内测用户的5大隐藏指令+3D可视化导出协议)
  • 2026年OpenClaw/Hermes Agent如何部署?图文步骤教程
  • 从开发到部署:手把手教你用Qt Creator为Jetson Nano配置交叉编译套件(Qt5.14.2 + OpenGL)