目录

一 前景导入

1 当前读

2 快照读

二 MVCC

1 隐藏字段

2 UndoLog 回滚日志

(1 UndoLog日志

(2 UndoLog版本链

3 Read View

面试八股

 介绍一下MVCC


一 前景导入

1 当前读

可使当前事务读取的是最新版本的数据,读取时还要保证其他并发事务不能修改当中记录,会对读取的记录进行加锁。

  • SELECT ... LOCK IN SHARE MODE (共享锁/S锁)

  • SELECT ... FOR UPDATE (排他锁/X锁)

  • UPDATEINSERTDELETE 操作(自动加排他锁)

2 快照读

简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁。

快照读本质上就是使用MVCC机制访问数据的历史版本

隔离级别快照读行为当前读行为
Read Committed每次 SELECT 都生成新的快照(能看到其他事务已提交的修改)始终读取最新已提交版本并加锁
Repeatable Read事务中第一个 SELECT 语句建立快照,后续读取都基于此快照(看不到后续修改)始终读取最新已提交版本并加锁
Serializable快照读退化为当前读(所有 SELECT 自动转为 SELECT ... LOCK IN SHARE MODE)正常当前读行为

二 MVCC

概念:MVCC全称:多版本并发控制。

MVCC允许多个事务同时读取同一行数据,但是确保了数据版本是当前事务开启之前的版本。(其他事务修改但是看见的版本还是修改之前的)

1 隐藏字段

在 InnoDB 的 MVCC 实现中,每条记录都包含三个关键隐藏字段,它们共同构建了多版本控制的基石:

字段名大小作用是否必选
DB_TRX_ID 事务ID6 字节记录最后修改该行的事务 ID 总是存在
DB_ROLL_PTR 回滚指针7 字节指向 Undo Log 中上一个版本的指针(构成版本链) 总是存在
DB_ROW_ID6 字节隐式自增主键(仅当无主键时生成) 条件存在

2 UndoLog 回滚日志

(1 UndoLog日志

概念:回滚日志,用于记录数据被修改前的信息

作用:是数据库实现事务原子性和多版本并发控制的核心机制

场景化描述
当事务需要回滚或一致性读时,内存中可能存在未提交的修改。
重启后或事务内,Undo Log 能提供旧数据版本,用于:

  • 撤销未提交的操作(回滚)

  • 构造历史快照(MVCC 非阻塞读)

(2 UndoLog版本链

Undo Log 版本链的核心价值正是通过精准的指针定位实现对历史版本的精确访问。

3 Read View

读视图,用于决定事务能看到哪些版本的数据。本质上是事务启动时对数据库系统状态的一次快照,解决了并发读写当中的数据可见性问题。

Read View 包含四个关键字段:

字段名描述作用
m_ids生成 Read View 时活跃事务ID列表(未提交的事务)判断数据版本是否由未提交事务创建
min_trx_id活跃事务中的最小事务ID加速判断:事务ID < min_trx_id 一定可见
max_trx_id系统预分配的下一个事务ID(非当前最大ID)判断:事务ID ≥ max_trx_id 一定不可见
creator_trx_id创建该 Read View 的事务ID(当前事务自身ID)避免看到自己未提交的修改

读已提交这个隔离级别当中,在每一个select 语句执行前都会生成一个ReadView。导致出现不可重复读的现象,可能出现两次读取数据不同的情况。

可重复读是执行第一条select时,生成一个ReadView然后整个业务期间都在使用这个ReadView。读取的数据始终相同,无视其他事务的提交。

举个例子

-- 事务A (RC级别)
BEGIN;  -- trx_id=100 (事务A被分配ID=100)-- 第一次查询 (创建ReadView1)
SELECT balance FROM accounts WHERE id=1; -- 返回1000
/* 
ReadView1状态:m_ids = [100]          -- 活跃事务ID列表 (当前只有事务A)min_trx_id = 100       -- 最小活跃事务ID (m_ids中的最小值)max_trx_id = 101       -- 下一个将分配的事务ID (当前最大事务ID+1)creator_trx_id = 100   -- 创建此ReadView的事务ID可见性判断过程:假设数据行初始db_trx_id=90 (小于min_trx_id)90 < min_trx_id(100) → 可见 → 返回1000
*/-- 事务B (trx_id=101) 启动并提交UPDATE accounts SET balance=900 WHERE id=1;-- 修改后数据行:--   db_trx_id = 101 (最后修改事务ID)--   db_roll_ptr → 指向旧版本(trx_id=90, balance=1000)COMMIT; -- 事务B提交,从活跃事务列表移除-- 第二次查询 (创建新ReadView2)
SELECT balance FROM accounts WHERE id=1; -- 返回900
/* 
ReadView2状态:m_ids = [100]          -- 活跃事务ID列表 (事务B已提交,只剩事务A)min_trx_id = 100       -- 最小活跃事务ID (仍是100)max_trx_id = 102       -- 下一个将分配的事务ID (101已使用)creator_trx_id = 100   -- 创建者事务ID可见性判断过程:当前行db_trx_id=1011. 101 != creator_trx_id(100) → 非当前事务修改2. 101 >= min_trx_id(100) 且 101 < max_trx_id(102) → 在[mins, max)范围内3. 检查m_ids=[100] → 101不在其中 → 已提交 → 可见返回当前版本数据900
*/

可见性判断规则优先级:

  • 首先检查:db_trx_id == creator_trx_id(当前事务自身修改)

  • 然后检查:db_trx_id < min_trx_id(在ReadView创建前已提交)

  • 再检查:db_trx_id >= max_trx_id(在ReadView创建后启动的事务)读取快照之后有事务过来修改了但是快照读取的是那一瞬间的值故才会出现大于max预分配的情况

  • 最后检查范围:min_trx_id <= db_trx_id < max_trx_id

    • 在m_ids中 → 未提交 → 不可见

    • 不在m_ids中 → 已提交 → 可见

三 面试八股

 介绍一下MVCC

首先我想介绍的是MVCC是什么,MVCC全称多版本并发控制,核心思想如同字面意思,为数据维护多个版本,而并非直接覆盖。

其次再说说其功能,其主要解决的是读写之间冲突而导致的并发性能问题。他让不同的事务在不同的隔离级别能看见不同的隔离级别,主要是RC与RR这两种隔离级别(RC是在每一次读取之前都会生成一个ReadView快照,而RR是只在第一次读取之前生成一个ReadView快照,RR则在一次事务当中就不会出现不可重复读的情况,而RC则会出现不可重复读的现象(因为其允许其他事务对其进行写的操作,导致读取的数据可能会出现不同,呆滞出现不可重复读))

核心:版本链+ReadView+undolog

这里说到了ReadView就涉及其原理部分了,这里就不得不提到一个隐藏字段,存储在数据行当中的db_trx_id(最后修改数据的事务id),在读取时会拿这个事务id与ReadView当中的字段进行对比,四个字段(创建当前ReadView事务的id,生成ReadView时活跃的最小事务id,生成ReadView时活跃的事务id的列表,生成ReadView时预分配的下一个事务id)

  • 首先检查:db_trx_id == creator_trx_id(当前事务自身修改)可见

  • 然后检查:db_trx_id < min_trx_id(在ReadView创建前已提交)可见

  • 再检查:db_trx_id >= max_trx_id(在ReadView创建后启动的事务)不可见

  • 最后检查范围:min_trx_id <= db_trx_id < max_trx_id

    • 在m_ids中 → 未提交 → 不可见

    • 不在m_ids中 → 已提交 → 可见

以上是对事务版本的判断,判断结束后如果是可见的,那么就直接返回该版本的数据作为查询结果,但是如果不可见,那么就需要用到版本链回溯到之前的版本,获取行数据的db_roll_ptr(回滚指针),指针指向上一个版本在undolog(回滚日志)当中具体位置

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

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

相关文章

[Pytest] [Part 2]增加 log功能

开始实现需求之前先做个log类&#xff0c;可以给其他模块使用&#xff0c;也方便以后修改log类的功能和属性。 使用的是python中的logging包来进行简单的封装&#xff0c;具体代码如下 import logging import sysclass TefLogger:def __init__(self, logger_nameTEST_FRAMEWOR…

NeighborGeo:基于邻居的IP地理定位(三)

NeighborGeo:基于neighbors的IP地理定位 X. Wang, D. Zhao, X. Liu, Z. Zhang, T. Zhao, NeighborGeo: IP geolocation based on neighbors, Comput. Netw. 257 (2025) 110896, 3. NeighborGeo 本文提出NeighborGeo,利用图结构学习和有监督对比学习来建立可靠的地标-目标关…

python使用fastmcp包编写mcp服务端(mcp_server)和mcp客户端(mcp_client)

安装fastmcp pip install fastmcp编写mcp服务端代码 from fastmcp import FastMCP mcp FastMCP(weather)mcp.tool() def get_weather(city: str):获取对应城市的天气:param city: 目标城市:return: 该城市的天气return f"{city}天气晴朗&#xff0c;温度60度&#xff01…

(1)机器学习小白入门 YOLOv:从概念到实践

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 目标检测一直是一个机器学习的一个重要的应用方向。而 YOLOv&#xff08;You Only Look Once&…

Appium 简介

Appium 是一个开源的移动应用自动化测试框架&#xff0c;用于测试原生应用(native)、混合应用(hybrid)和移动网页应用(mobile web)。它支持 iOS、Android 和 Windows 平台。 https://www.bilibili.com/video/BV1R93szkEhi/? App自动化测试&#xff1a;App测试AppiumUiAutomato…

【C语言刷题】第十一天:加量加餐继续,代码题训练,融会贯通IO模式

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

免费版安全性缩水?ToDesk、TeamViewer、向日葵、网易UU远程访问隐私防护测评

一、前言 在这个居家办公、远程技术支持成为常态的时代&#xff0c;我们经常需要把电脑控制权交给远方的同事或技术人员。但你想过没有&#xff0c;那些免费远程控制软件&#xff0c;真的能保护好你的隐私吗&#xff1f; 好用的远程软件通常会收费运营&#xff0c;投入经费去开…

nginx部署发布Vite项目

1 引言 在之前的文章《Ubuntu云服务器上部署发布Vite项目》中笔者使用了Vite提供的预览服务(npm run preview)来在云服务器上发布Web应用。这样做轻量应用是没问题的&#xff0c;不过遇到一些专业的问题就不行了&#xff0c;最好还是使用专业的HTTP服务器。除此之外&#xff0…

Unity文件夹标签 —— FolderTag

GitHub地址 FolderTag 下载之后解压&#xff0c;将FolderTag文件夹拖进Unity项目的Assets文件夹 选中文件夹&#xff0c;填上标签

【0基础开发油猴脚本】某漫画网站图片旋转

有朋友在用某漫画网站在线看漫画&#xff0c;但是那个网站会把漫画图片右旋90度&#xff0c;如图。于是&#xff0c;他就像我发起了求助&#xff0c;问我能不能写个脚本。我说&#xff0c;AI都发展到2025了&#xff0c;前端&#xff08;脚本&#xff09;这种东西还用自己写吗&a…

Vue Router 中,params参数的名称必须与路由配置中的动态路径参数名完全一致

路由配置与 params 参数的绑定关系 在路由配置中&#xff0c;使用 冒号&#xff08;:&#xff09; 定义动态路径参数&#xff1a; // router.js&#xff08;路由配置&#xff09; { path: /search/:keyword, // 这里的:keyword是动态路径参数 name: Search, component: S…

Spring Boot 应用开发实战指南:从入门到实战(内含实用技巧+项目案例)

&#x1f4d8; Spring Boot 应用开发实战指南&#xff1a;从入门到实战&#xff08;内含实用技巧项目案例&#xff09;&#x1f680; 你是否还在为 Spring 配置复杂、开发效率低下而苦恼&#xff1f;Spring Boot 早已成为 Java 后端开发的“标配”&#xff0c;本篇文章将带你全…

【NLP入门系列五】中文文本分类案例

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒…

【微信小程序】- 监听全局globalData数据

【微信小程序】- 监听全局globalData数据 数据劫持&#xff08;Object.defineProperty&#xff09;实现适用场景 数据劫持&#xff08;Object.defineProperty&#xff09; 实现 通过拦截 globalData 的属性读写实现自动监听&#xff0c;适合精确监听特定变量。 ​实现步骤​&…

高速公路闲置土地资源化利用:广西浦北互通3MW分布式光伏监控实践

摘要&#xff1a; 分布式光伏项目在清洁能源转型中扮演重要角色&#xff0c;其创新的空间利用模式有助于缓解能源开发与土地资源间的矛盾。广西大唐至浦北高速公路&#xff08;浦北互通&#xff09;项目&#xff0c;利用高速公路沿线闲置空地建设光伏电站&#xff0c;发挥了分布…

【Linux网络编程】网络基础

目录 计算机网络背景 初识协议 网络协议 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 再识协议 为什么要有TCP/IP协议&#xff1f; 什么是TCP/IP协议&#xff1f; 重谈协议 网络传输基本流程 局域网传输流程 跨网络传输流程 Socket编程预备 理解源IP地址与目的…

BlenderBot对话机器人大模型Facebook开发

文章目录 &#x1f680; BlenderBot 的关键特性&#x1f9ea; 版本与改进&#x1f4ca; 应用实例 Blender是搅拌机&#xff0c;果汁机&#xff0c;混合机的意思。 BlenderBot 是由 Facebook AI Research (FAIR) 开发的一种先进的对话生成模型。它旨在通过融合多种对话技能&…

60天python训练计划----day59

在之前的学习中&#xff0c;我们层层递进的介绍了时序模型的发展&#xff0c;从AR到MA到ARMA&#xff0c;再到ARIMA。本质就是把数据处理的操作和模型结合在一起了&#xff0c;实际上昨天提到的季节性差分也可以合并到模型中&#xff0c;让流程变得更加统一。 季节性差分用S来…

学习日志05 python

我相信事在人为&#xff0c;人定胜天&#xff0c;现在还是在基础语法上面打转&#xff0c;还是会提出一些很低级的很基础的问题&#xff0c;不要着急&#xff0c;波浪式前进、螺旋式上升的过程吧&#xff0c;虽然现在的确是很绝望吧...... 今天要做一个练习&#xff1a;编写猜…

LiteHub中间件之gzip算法

gzip算法理论部分LZ777算法霍夫曼编码算法改进型的LZ777算法代码实现压缩对象gzip实现运行分析日志查看wireshark抓包查看后台管理界面查看理论部分 gzip是一种无损压缩算法&#xff0c;其基础为Deflate&#xff0c;Deflate是LZ77与哈弗曼编码的一个组合体。它的基本原理是&…