【MySQL】MVCC:从核心原理到幻读解决方案 - 实践

news/2025/10/20 18:09:27/文章来源:https://www.cnblogs.com/yxysuanfa/p/19153281

【MySQL】MVCC:从核心原理到幻读解决方案

    • MVCC
      • undo log
      • ReadView
        • (1)read view 具备 4 个关键字段
        • (2)可见性判断规则
    • 隔离级别
      • 1. 当前读 vs 快照读
        • (1)快照读:普通 select,读版本链的旧版本
        • (2)当前读:加锁的读 / 写,读数据的最新版本
      • 2. 四种隔离级别的达成逻辑
        • (1)读未提交(Read Uncommitted)
        • (2)读已提交(Read Committed)
        • (3)可重复读(Repeatable Read)
        • (4)串行化(Serializable)
    • 幻读
      • 1. 常规场景:快照读 + 间隙锁
        • (1)快照读:看不到新增资料,自然无幻读
        • (2)当前读:加间隙锁,阻止其他事务新增
      • 2. 极端场景:先快照读,再当前读
        • 反例 1:查不到数据,插入却失败
        • 反例 2:查不到数据,却能修改
      • 3. 极端幻读的解决方案:强制当前读,提前加锁

信不信?花几分钟时间,你就能彻底搞懂 MVCC(多版本并发控制)。其实要吃透 MVCC,关键就是搞懂这几个核心障碍:MVCC 是什么?用来解决什么问题?怎么实现的?四种隔离级别如何依托 MVCC 实现?当前读和快照读有啥区别?可重复读隔离级别下,怎么避免幻读?如果避不开,有哪些反例?极端幻读场景又该怎么处理?

从并发事务的痛点说起。假设数据库里一张表存了大量内容,同时有很多事务在访问或修改这些资料 —— 此种并发场景下,很容易出现脏读、不可重复读、幻读这三大问题。要解决这些问题,就得靠隔离级别和 MVCC 的配合。

MVCC

MVCC 指的是多版本并发控制,是通过版本链和 ReadView 机制来实现的。

MVCC通过维护数据的多个版本,让不同事务在并发访问时,能读到符合自己隔离级别的内容版本,从而避免脏读、不可重复读,同时尽可能提高并发性能。

比如:

  • 要解决 “脏读”(读到其他事务未提交的数据):就让事务只读 “已提交的版本”;

  • 要解决 “不可重复读”(同一事务内多次读同一素材,结果不一样):就让事务每次都读 “同一个版本”。

undo log

img

  1. 每条记录含有两个隐藏列最近修改的事务 ID指向 Undo Log 的指针,用于构成版本链。
  2. 每次更新数据时,会生成一个新的数据版本,并将旧版本的数据保存到 Undo Log 中。
  3. 每次读取资料时,会生成一个ReadView,用于判断哪个版本的数据对当前事务可见

举个例子:事务 1(ID=10)把user表中id=1的age从 20 改成 25,事务 2(ID=20)又把这个age改成 30。最终的版本链会是这样:

当前数据(age=30):  DB_TRX_ID=20,DB_ROLL_PTR→undo log2(age=25)
undo log2(age=25):DB_TRX_ID=10,DB_ROLL_PTR→undo log1(age=20)
undo log1(age=20):DB_TRX_ID=null(初始数据),DB_ROLL_PTR=null

如果事务想读旧版本,顺着DB_ROLL_PTR往下找就行。

ReadView

有了版本链,问题来了:事务查询时,怎么知道该读哪个版本?比如事务 3(ID=30)查id=1的数据,该读 age=30、25 还是 20?

这时候就需要read view(读视图)—— 它相当于一个 “过滤规则”,记录了当前事务启动时,数据库中 “活跃且未提交的事务 ID”,凭借对比数据版本的DB_TRX_ID和 read view 的规则,就能判断该版本是否可见。

img
(1)read view 囊括 4 个关键字段
(2)可见性判断规则
img

一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这几种情况:

  • 如果记录的 trx_id 值小于Read View 中的 min_trx_id 值,表示这个版本的记录是在创建 Read View已经提交的事务生成的,因此该版本的记录对当前事务可见

  • 如果记录的 trx_id 值大于等于 Read View 中的 max_trx_id 值,表示这个版本的记录是在创建 Read View才启动的事务生成的,因而该版本的记录对当前事务不可见

  • 假如记录的 trx_id 值在 Read View 的 min_trx_id 和 max_trx_id之间,需要判断 trx_id 是否在 m_ids 列表中:

    • 如果记录的 trx_idm_ids 列表中,表示生成该版本记录的活跃事务依然活跃着(还没提交事务),所以该版本的记录对当前事务不可见
    • 假如记录的 trx_id不在m_ids列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见

ReadView 关键用来处理隔离级别为**“可重复读"和"读已提交”**的情况。因为在这两个隔离级别下,事务在读取数据时,需保证读取到的数据是一致的,即读取到的数据是在事务开始时的一个快照。

隔离级别

1. 当前读 vs 快照读

(1)快照读:普通 select,读版本链的旧版本

快照读就是我们平时执行的普通 select 语句(比如select * from user where id=1),它的特点是:

(2)当前读:加锁的读 / 写,读数据的最新版本

当前读是指 “必须读数据最新版本” 的操作,这些操作会加锁,防止其他事务修改,包括:

  • 加排他锁的读:select … for update;

  • 加共享锁的读:select … in share mode;

  • 所有写操作:insert、update、delete(写之前必须先读最新版本,判断是否符合条件)。

当前读的特点是:

  • 加锁(行锁或间隙锁),会阻塞其他事务的写操作;

  • 不读版本链,直接读数据的最新版本,确保 “写操作基于最新内容”。

比如你执行update user set age=30 where id=1,MySQL 会先 “当前读” id=1 的最新内容,确认存在后再修改 —— 若是此时有其他事务改了 id=1 的数据,会被当前读的锁阻塞。

2. 四种隔离级别的实现逻辑

(1)读未提交(Read Uncommitted)

读未提交是最低的隔离级别,它的逻辑很 “简单粗暴”:直接读数据的最新版本,不管修改该版本的事务是否提交。比如事务 A 改了数据但没提交,事务 B 就能直接读到这个 “脏内容”—— 因此它根本不需要 MVCC 的版本链和 read view,天然就是读未提交。

(2)读已提交(Read Committed)

读已提交的核心要求是 “只能读已提交的数据”,它靠 MVCC 实现的逻辑是:每次执行 select 语句(快照读)时,都会重新生成一个 read view

举个例子:

这就是读已提交:每次读都用新的 read view,能看到 “最新已提交的版本”,避免了脏读,但无法避免 “不可重复读”(同一事务内两次读结果不同)。

(3)可重复读(Repeatable Read)

可重复读是 MySQL 的默认隔离级别,核心要求是 “同一事务内多次读同一数据,结果一致”,它的实现逻辑是:只在事务第一次执行 select(快照读)时生成 read view,后续所有 select 都复用这个 read view

刚才的例子:就是还

  • 事务 2(ID=20)第一次 select:生成 read view1,m_ids=[10],读 age=20;

  • 读 age=20。就是事务 1 提交后,事务 2 第二次 select:复用 read view1,此时 trx_id=10 仍在 m_ids 中(read view1 没更新),所以还

这样就实现了 “可重复读”:不管其他事务是否提交,同一事务内都用同一个 read view,读的始终是 “第一次看到的版本”,避免了脏读和不可重复读。

(4)串行化(Serializable)

串行化是最高隔离级别,它的逻辑最轻松:所有事务串行执行,读写都加锁(读加共享锁,写加排他锁),完全禁止并发。比如事务 A 读数据时,事务 B 不能改;事务 A 改数据时,事务 B 不能读 —— 这种方式能避免所有并发疑问,但性能极差,实际业务中很少用。

幻读

幻读是指 “同一事务内,两次执行相同的查询,结果集的行数不一样”(比如第一次查有 10 条数据,第二次查有 11 条,多了一条其他事务新增的)。

可重复读是 MySQL 的默认隔离级别,它能处理脏读和不可重复读,但幻读疑问该怎么处理?咱们从 “常规解决方式” 和 “极端场景应对” 两方面说。

1. 常规场景:快照读 + 间隙锁

可重复读经过 “快照读避免新增可见” 和 “当前读加间隙锁阻止新增”,解决了大部分幻读问题:

(1)快照读:看不到新增内容,自然无幻读

普通 select(快照读)靠 MVCC 读旧版本,在可重复读隔离级别下,复用第一次生成的 read view—— 不管其他事务新增 / 删除了多少数据,当前事务都看不到,结果集行数始终不变,自然不会出现幻读。

比如事务 A 第一次查id>100的资料有 5 条,事务 B 新增了 1 条id=101的数据并提交,事务 A 再查id>100的数据,还是 5 条(快照读看不到新增的 1 条),避免了幻读。

(2)当前读:加间隙锁,阻止其他事务新增

执行select … for update、insert、update、delete 等当前读操作时,MySQL 会加 “间隙锁”(属于行锁的一种),锁住 “数据之间的间隙”,阻止其他事务插入数据,从而避免幻读。

举个例子:执行select * from user where id>100 for update(当前读):

2. 极端场景:先快照读,再当前读

会出现幻读,咱们看两个典型反例:就是可惜,“快照读 + 间隙锁” 不能解决所有幻读问题 —— 当事务内 “先快照读,再当前读” 时,还

反例 1:查不到材料,插入却失败
反例 2:查不到内容,却能修改
  • 事务 A:select * from user where name=‘AA’(快照读),结果为空;

  • 事务 B:insert into user(name) values(‘AA’),提交;

  • 事务 A:再次select * from user where name=‘AA’(快照读),仍为空;

  • 事务 A:执行update user set age=20 where name=‘AA’,却提示 “1 row affected”(修改成功);

  • 事务 A:再查select * from user where name=‘AA’,就能看到 age=20 的数据 —— 这更诡异:快照读不到,却能修改,修改后又能读到,本质也是 “先快照读,再当前读” 导致的幻读。

3. 极端幻读的解决方案:强制当前读,提前加锁

要解决这种极端幻读,核心思路是:在事务开始时,就用当前读(加锁)代替快照读,提前锁住间隙,阻止其他事务新增 / 删除数据

具体做法有两种:

核心原则就是:直接用当前读加锁,提前阻断其他事务的写操作就是如果事务内需要 “先查后写”,且不允许出现幻读,就不要用普通的快照读,而

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP协议(从HTTP3.0开始,切换为UDP)就是HTTP 是 超文本传输协议的缩写HTTP1.1是互联网主流版本HTTP在传输层主要依赖的

TCP协议(从HTTP3.0开始,切换为UDP)就是HTTP 是 超文本传输协议的缩写HTTP1.1是互联网主流版本HTTP在传输层主要依赖的pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…

设计极致高效的文件分享系统:哈希算法的艺术与科学

如何在确保文件唯一性的同时,打造短小精悍的分享链接?设计极致高效的文件分享系统:哈希算法的艺术与科学如何在确保文件唯一性的同时,打造短小精悍的分享链接?在日常工作中,我们经常需要分享文件——无论是团队协…

页面测试记录

记录自己的折腾历程闲言碎语记录代码展示: <div style="font-family: Arial, sans-serif; background-color: #fff; padding: 20px; max-width: 1500px; margin: 0 auto;"><div style="backg…

2025年律师事务所权威推荐榜单:房产纠纷/土地/拆迁/继承,婚姻家事/离婚/抚养权/财产纠纷,刑事辩护/合同纠纷/债务债权/交通事故/股权/劳动/企业顾问/知识产权

2025年律师事务所权威推荐榜单:专业法律服务机构的深度解析 在法治建设不断深化的今天,专业律师事务所已成为维护公民权益、保障企业合规经营的重要力量。随着社会经济的快速发展,房产纠纷、婚姻家事、刑事辩护、合…

实用指南:Deepoc具身模型外拓板:重塑居家服务机器人的交互革命

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW) - 实践

springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW) - 实践2025-10-20 18:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: aut…

AWS IMDSv2区域级强制实施:提升云安全新举措

本文详细介绍AWS最新推出的区域级IMDSv2强制实施功能,涵盖其安全机制演进历程、API调用方法、Terraform支持实现,以及多层级配置优先级规则,帮助用户全面提升EC2实例元数据服务的安全性。IMDSv2强制实施:即将登陆您…

三桶油

三桶油好的,这是一个非常重要且常见的问题。中国的石油工业格局通常被概括为 “三桶油”,但它们之间有着明确的分工和区别。近年来,随着改革和市场变化,格局也有所演变。 核心:“三桶油” 这是中国石油石化行业的…

2025年涂布机厂家权威推荐榜:PE涂布机,PET涂布机,纸张涂布机,片材涂布机,铜箔铝箔涂布机,TPU涂布机,OPP涂布机,无纺布涂布机,涂布机复合机,石墨烯涂布机,热熔胶涂布机,光学膜涂布机

2025年涂布机厂家权威推荐榜:PE涂布机,PET涂布机,纸张涂布机,片材涂布机,铜箔铝箔涂布机,TPU涂布机,OPP涂布机,无纺布涂布机,涂布机复合机,石墨烯涂布机,热熔胶涂布机,光学膜涂布机 行业背景与发展趋势 涂…

2025 年氢气压缩机生产厂家最新推荐榜:聚焦专业服务与市场口碑的权威甄选指南蚌埠氢气压缩机/安徽氢气压缩机厂家推荐

引言 在全球绿色低碳转型加速推进的背景下,氢能源产业迎来爆发式增长,氢气压缩机作为氢能源储存、运输及应用的核心设备,其性能与品质直接决定产业链效率与安全。当前市场上氢气压缩机品牌繁杂,部分厂家技术薄弱、…

selnium 之实际案例

selnium 之实际案例 1、文本框和密码框定位、按钮 案例链接:http://49.233.201.254:8080/cms/manage/login.do 案例: from selenium import webdriver from time import * dx=webdriver.Chrome() dx.get("…

第十九篇

今天是10月20号,链接了数据库,还在学习web界面开发

2025 年国内油井气压缩机源头厂家最新推荐榜:聚焦行业标杆企业,助力精准选购

引言 在石油、化工等能源行业高速发展的当下,油井气压缩机作为核心设备,直接决定生产效率与安全。然而当前市场中,油井气压缩机厂家数量繁杂,部分企业技术薄弱、工艺落后,产品稳定性与节能性不足,不仅增加企业运…

计算机毕业设计Hadoop+Spatk+Hive滴滴出行分析 出租车供需平衡优化系统 出租车分析预测 大素材毕业设计(源码+LW+PPT+讲解)

计算机毕业设计Hadoop+Spatk+Hive滴滴出行分析 出租车供需平衡优化系统 出租车分析预测 大素材毕业设计(源码+LW+PPT+讲解)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

QT 5.14.2 Openssl开发

工作有旧工程,使用的是Qt5.14.2版本,请求https时提示不支持。现在找到解决方案了,在这里记录一下。 对应安装openssl1.1.1的库即可。

2025年市面上防撞板品牌与行业内实力厂家排行榜前十强:权威解析与选择指南

摘要 防撞板作为现代建筑装饰中的重要材料,近年来在酒店、医院、学校等场所得到了广泛应用,行业年增长率保持在15%以上(数据来源:中国建筑材料联合会,2024年报告)。随着环保和安全需求的提升,防撞板市场正朝着高…

2025年防撞板品牌排名前十权威推荐:行业趋势与选择指南

摘要 随着建筑装饰行业对安全性和环保性要求的提升,防撞板市场在2025年迎来快速增长,年均复合增长率预计达15%。行业趋势聚焦于绿色材料、智能安装和高性价比产品,推动品牌创新。本文基于用户搜索意图,提供防撞板品…

2025 年液化气压缩机生产厂家最新推荐榜单:聚焦优质企业,深度解析生产实力与产品品质蚌埠液化气压缩机/安徽液化气压缩机厂家推荐

引言 在石油、化工、燃气等关键行业的生产运营中,液化气压缩机作为核心设备,其性能稳定性、质量可靠性与技术适配性直接关系到企业的生产效率、运营安全及成本控制。当前市场上,液化气压缩机生产企业数量繁杂,不同…

2025年票务系统厂家权威推荐榜:景区售票/闸机/验票系统,智慧文旅平台与票务管理软件全景解析

2025年票务系统厂家权威推荐榜:景区售票/闸机/验票系统,智慧文旅平台与票务管理软件全景解析 随着数字经济的深入发展,文旅产业正经历着前所未有的数字化转型浪潮。作为智慧景区建设的核心基础设施,票务系统已从单…

2025年棒球帽源头厂家推荐排行榜,定制棒球帽,刺绣棒球帽,运动棒球帽,防晒棒球帽,潮流棒球帽公司精选推荐

2025年棒球帽源头厂家推荐排行榜:定制、刺绣、运动、防晒、潮流棒球帽公司精选 行业背景与发展趋势 棒球帽作为兼具功能性与时尚性的头部配饰,近年来在全球服饰市场中保持着稳定的增长态势。根据行业数据显示,2024年…