0

0

MySQL中MVCC机制是什么

PHPz

PHPz

发布时间:2023-06-03 09:41:16

|

1960人浏览过

|

来源于亿速云

转载

一、概述:

mvcc,全称multi-version concurrency control,即多版本并发控制。mvcc是一种多并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
我们知道,mysql在5.5后由myisam存储引擎改成了innodb存储引擎,主要是因为innodb是支持事务的,那么当多线程同时执行的时候,可能会出现并发问题。这个时候可能会出现一个能够控制并发的方法,mvcc就起到了这个作用。

MVCC主要靠undo log版本链与ReadView来实现。

二、什么是Undo log

  • Undo log主要用于事务回滚时恢复原来的数据。

  • mysql在执行sql时,会将一天逻辑相反的日志保存到undo log中。因此,undo log中记录的也是逻辑日志。

  • 但mysql执行Insert语句时,会在undo log日志中记录本次插入的主键id。等事务回滚时,delete删除此id。

  • 在执行update语句时,MySQL会将修改前的数据保存在undo log中。等事务回滚时,再执行一次update,得到原来的数据。

  • 当MySQL执行delete语句时,会在undo log中保存删除前的数据。等事务回滚时,再执行insert,插入原来的数据。

  • 数据库中的四大特性–原子性,即事务是不可分割的,要么全部成功,要不全部失败,其底层就靠undo log来实现。在执行某一条语句失败时,就会对之前事务的语句进行回滚。

三、行的隐藏列

  • 在数据库的每行上,除了存放真实的数据以外,还存在3个隐藏的列:row_id、trx_id和roll_pointer

  • row_id,行号:

 如果当前表有整数类型的主键,那么row_id的值就是主键的值如果没有整数类型的主键,则MySQL会按照字段的顺序选择一个非空的整数类型的唯一索引为row_id如果都没有找到,则会创建一个自动增长的整数作为row_id
  • trx_id,事务号:

当一个事务开始执行前,MySQL就会为这个事务分配一个全局自增的事务id。
之后该事务对当前进行的增、改、删除等操作时,都会将自己的事务ID记录到trx_id中。

  • roll_pointer,回滚指针:

 事务对当前数据改动时,会将旧的数据记录到undo log中,在将数据写入当前行,且当前的roll_pointer指向刚才那个undo log,因此可通过roll_pointer来找到改行前一个版本。
当一直有事务对该行改动时,就会一直生成undo log,最终将会形成undo log版本链。

四、Undo log版本链

一开始,我们使用以下语句创建一个stduent表

CREATE TABLE `student` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ) NOT NULL,
	`age` INT ( 11 ) NOT NULL,
  PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB;

现在开启第一个事务,事务id为1,执行以下插入语句。

INSERT INTO student VALUES ( 1, "a", 24 );

那么当前的示意图如下:

MySQL中MVCC机制是什么

因为该数据是新插入的,因此它的roll_pointer指向的undo log为空。

接着开启第2个事务,分配的事务id是2,执行以下修改命令。

UPDATE student SET NAME = 'b' WHERE id = 1;

现在的示意图变为:

MySQL中MVCC机制是什么

当开启第3个事务,分配到事务id是3,执行以下修改命令。

行盟APP1.0 php版
行盟APP1.0 php版

行盟APP是结合了通信和互联网的优势,加之云计算所拥有的强大信息资源,借助广大的终端传递服务,潜在的拥有巨大商机。她到底是什么,又有什么作用?她是一款手机应用软件;她是一款专门为企业服务的手机应用软件;她是一款能够将企业各种信息放入其中并进行推广传播的手机应用软件!只要轻轻一点,企业的简介,产品信息以及其他优势就能最快最大限度的透过手机展现在客户的眼前,一部手机,一个APP,你面对的将是一个6亿&

下载
UPDATE student SET age = 25 WHERE id = 1;

示意图变为:

MySQL中MVCC机制是什么

每个事务对该行进行改动时,都会生成一个undo log,用于保存之前的版本,之后再将新版本的roll_pointer指向刚才生成的undo log。
因此,roll_pointer可以将这些不同版本的undo log串联起来,形成undo log的版本链。

五、关于ReadView

首先需要理解一下快照读与当前读
快照读:简单的select查询,即不包括 select … lock in share mode, select … for update,可能会读到数据的历史版本。
当前读:以下语句都是当前读,总是读取最新版本,会对读取的最新版本加锁。

select ... lock in share mode
select ... for update
insert
update
delete

在事务执行每一个快照读或事务初次执行快照读时,会生成一致性视图,即ReadView。
ReadView的作用是,判断undo log版本链中的哪些数据对当前事务可见。

ReadView包含以下几个重要的参数:

  • m_ids

    • 在创建ReadView的那一刻,mysql中所有未提交的事务id集合。

  • min_trx_id

    • m_ids中的最小值

  • max_trx_id

    • mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。

  • creator_trx_id

    • 即创建此ReadView的事务id

简要的示意图如下:

MySQL中MVCC机制是什么

那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。

  • 如果当前undo log的版本的trx_id

  • 如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。

  • 如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:

  在m_ids中,说明版本对应的事务未提交,因此是不可见的。

  不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
  • 如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。

  • 当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

15

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

221

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 846人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号