MySQL——MVCC(多版本并发控制)

目录

1.MVCC多版本并发控制的一些基本概念

MVCC实现原理

记录中的隐藏字段

undo log

undo log 版本链

ReadView

数据访问规则

具体实现逻辑

总结


1.MVCC多版本并发控制的一些基本概念

当前读:该取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对该取的记录进行加锁。对于我们日常的操作,如:select...lock in share mode(共享锁), select...for update,update,insert. delete(排他锁)都是一种当前读。

快照读:简单的select(不加锁)就是快照读,快照读读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。正常select语句就是一个快照读,

  • read committed:每次select,都生成一个快照读。
  • repeatable read:开启事务后第一个select语句才是快照读的地方。
  • serializable:快照读会退化为当前读。

MVCC:全称multi-versioncurency contol,多版本井发控制,指推护一个数据的多个版本,使得读写提作没有冲突,快照读为MySQL实现。MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段,undolog日志,readview。

MVCC实现原理

记录中的隐藏字段

DB_TRX_ID:最近修改事务id,记录插入这条记录或者最后一次修改记录的事务id

DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本

DB_ROW_ID:隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

undo log

回滚日志,在insert,update,delete的时候产生的便于数据回滚的日志。记录数据回滚之前是什么样的

insert:产生的undo log日志在回滚时需要,在事务提交后,可被立即删除。

undate,delete:产生undo log日志不仅在回滚时需要,在快照读时也需要,不会被立即删除

undo log 版本链

1.首先事务2去执行sql语句之前InnoDB引擎会在undo log日志里记录数据回滚前是什么样

再去修改数据,DB_TRX_ID会修改为当前事务id,DB_ROLL_PTR会指向回滚日志

2.事务3去修改数据首先会在undo log 日志记录当前数据,再去修改数据DB_TRX_ID修改为3,DB_ROLL_PTR指向当前日志记录,当前日志记录指向前一次记录形成一个版本链

所以undo log版本链指的是:不用事务或者相同事务对同一条记录进行修改,导致该记录的undolog生成一条记录版本链表,链表头部是最最新的旧纪录,链表尾部是最早的旧纪录。

那我们应该选择哪一个版本呢在事务回滚的时候?

ReadView

ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id

ReadView包含了四个核心字段:

不同的隔离级别,生成ReadView的时机不同:

read committed:在事务中每一次执行快照读时生成readview.
repeatableread:仅在事务中第一次执行快照读时生成readview,后续复用该readview.

数据访问规则

  • 1.trx_id(当前事务id)==cteator_trx_id(创建快照版本的事务id)?可以访问该版本->  成立,说明数据时当前这个事务更改的
  • 2.trx_id<mix_trx_id(最小活动事务id,最先开启事务还没有提交事务id)?可以访问该版本->  成立,说明数据已经提交了
  • 3.trx_id > max_trx_id?不可以访问该版本->  成立,说明该事务是在readview生成后才开启。
  • 4.min_trx_id <= trx_id <= max_trx_id?如果trx_id不在m_ids中是可以访问该版本的->  说
  • 明数据已经提交

具体实现逻辑

1.m_ids:{3,4,5}由图可知,事务2commited了还有3,4,5没有提交

2.min_trx_id:3 事务3是还没有提交事务的最早开启事务的

3.max_trx_id:6 预先分配事务,下一个事务为6

4.creator_trx_id:5创建readview的为事务5

在RC(read commited)隔离级别下查找快照读版本逻辑

1.当前记录DB_TRX_ID = 4根据数据访问规则去匹配,发现这四条规则一体条都匹配不上,选择去undo log版本链找第二条记录

2.第二条记录当前操作事务id=3,也就是DB_TRX_ID = 3根据数据访问规则去匹配发现这四条规则也一样一条匹配不上,选择去undo log 版本链找第三条记录操作事务id = 2

3.第三条记录当前操作事务id = 2,根据数据数据访问规则去匹配,发现 trx_id < min _ trx_id匹配上了说明这次快照读找的版本是这条记录id = 2,直接把这个版本记录直接返回

在RR(repeatatable)事务隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView

在第二次快照读的时候不会生成快照读,复用上面readview,可重复读

两个readview都一样,匹配规则肯定一样,查找出来的数据也是一模一样,这就保证了可重复读

总结

MVCC作用主要我们在快照读的时候来决定我们提取的到底是哪个版本

MVCC实际上实现原理是3部分,隐藏字段,Undo log ,Read View

隐藏字段:主要取决于事务id,和回滚指针

undo log 版本链

Read View读视图

MVCC  + 锁保证了事务当中的隔离性,一致性:指的是数据执行前和执行之后是一致的,如果事务执行失败全部回滚保证数据执行前后一致,一致性由 redo log 和undo log 保证的

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

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

相关文章

【Linux篇】深入理解文件系统:从基础概念到 ext2 文件系统的应用与解析

文件系统的魔法&#xff1a;让计算机理解并存储你的数据 一. 文件系统1.1 块1.2 分区1.3 inode(索引节点) 二. ext2文件系统2.1 认识文件系统2.2 Block Group (块组)2.2.1 Block Group 的基本概念2.2.2 Block Group 的作用 2.3 块组内部结构2.3.1 超级块&#xff08;Super Bloc…

3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法

1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件&#xff0c;用于存储用户的个性化设置和偏好。通过该文件&#xff0c;用户可以自定义和覆盖 VS Code 的默认行为&#xff0c;包括但不限于以下方面&#xff1a; 编辑器外观&#…

【Java面试系列】Spring Cloud微服务架构中的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Cloud微服务架构中的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识 1. 引言 在微服务架构中&#xff0c;分布式事务处理是一个复杂且常见的问题。随着业务规模的扩大&#xff0c;单体应用逐渐拆分为多个微服务&#xff0c;每个服务…

力扣面试150题--有效的数独

Day 19 题目描述 思路 其实还挺简单的&#xff0c;主要的难点在于如何判断每个小数独是否满足要求 详细见代码 class Solution {public boolean isValidSudoku(char[][] board) {HashSet<Character> set new HashSet<>();//处理行HashSet<Character> set1…

达梦数据库-学习-15-大内存SQL相关视图介绍

目录 一、环境信息 二、介绍 三、数据字典表 1、V$MEM_POOL 2、V$SQL_STAT 3、V$SQL_STAT_HISTORY 4、V$LARGE_MEM_SQLS 5、V$SYSTEM_LARGE_MEM_SQLS 四、总结 一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Co…

从0到1使用C++操作MSXML

1. 引言 MSXML&#xff08;Microsoft XML Core Services&#xff09;是微软提供的一套用于处理XML的COM组件库&#xff0c;广泛应用于Windows平台的XML解析、验证、转换等操作。本文将详细介绍如何从零开始&#xff0c;在C中使用MSXML解析和操作XML文件&#xff0c;包含完整的…

Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)

前言 资源 一、准备工作 &#xff08;一&#xff09;下载 VMware Workstation &#xff08;二&#xff09;下载 CentOS 7 镜像 二、安装 VMware Workstation&#xff08;比较简单&#xff0c;按下面走即可&#xff09; 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…

应用安全系列之四十五:日志伪造(Log_Forging)之三

1、简介 针对Java的日志系统有多种&#xff0c;本文主要描述如何通过修改配置文件来解决logback和log4j的日志伪造问题。 2、logback 2.1、系统提供的解决方案 在logback.xml中配置编码器自动转义特殊字符&#xff1a; 复制 <configuration><appender name"C…

(五)循环链表、双向链表

循环链表 介绍 在单选链表基础上&#xff0c;下一个节点指向前一个节点&#xff0c;最后一个节点指向起点 封装循环链表 为了让循环链表可以继承自单向链表&#xff0c;对其进行重构 给其增加一个tail属性&#xff08;尾节点&#xff09;&#xff0c;对各方法进行重写整理 …

仙剑奇侠传98柔情版游戏秘籍

战斗秘技&#xff1a;在战斗中输入 “cheat”&#xff0c;然后输入 “v” 直接取胜&#xff1b;输入 “y” 敌人不攻击。另外&#xff0c;在战斗中按 “XJPXZ123” 加 “shift” 键&#xff0c;攻击力增加 1000&#xff05;。等级提升秘籍&#xff1a;当李逍遥等级到达 99 级时…

常见的归一化(Normalization)方法

本文详解深度学习中常见的归一化方法。 【归一化是将数据按比例缩放&#xff0c;使之落入一个特定的区间】目录 1. 批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;1.1 数学原理1.2 代码示例 2. 层归一化&#xff08;Layer Normalization&#xff0c;LN&…

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (参考文献部分)

行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第一部分&#xff09;-CSDN博客 行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第二部分&…

大模型可视化应用敏捷开发方案:Dify+Echarts

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 Moe模式&#xff1a;或将是最好的大模型应用开发路径一文带你了解大模型RAG详细记录…

23种GoF设计模式

GoF&#xff08;Gang of Four&#xff09;设计模式是由四位计算机科学家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的书籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的设计模式 目录 一、创建型模式&#xff08;Cre…

Losson 4 NFS(network file system(网络文件系统))

网络文件系统&#xff1a;在互联网中共享服务器中文件资源。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind &#xff1a;管理nfs所有进程端口号的程序 nfs的部署 1.客户端和服务端都安装nfs-utils和rpcbind #安装nfs的软件rpcbind和…

C++ 入门六:多态 —— 同一接口的多种实现之道

在面向对象编程中&#xff0c;多态是最具魅力的特性之一。它允许我们通过统一的接口处理不同类型的对象&#xff0c;实现 “一个接口&#xff0c;多种实现”。本章将从基础概念到实战案例&#xff0c;逐步解析多态的核心原理与应用场景&#xff0c;帮助新手掌握这一关键技术。 …

关于C使用Windows API获取系统管理员权限和对文本属性的操作,以及windows API的核心操作

关于windows系统的操作程序开发&#xff0c;本文介绍一部分重要的文本属性操作&#xff0c;和运行计次器。 获取系统管理员权限 #include <windows.h> VOID ManagerRun(LPCSTR exe, LPCSTR param, INT nShow) { //注意&#xff1a;会跳出提示。SHELLEXECUTEINFO ShExec…

Web 项目实战:构建属于自己的博客系统

目录 项目效果演示 代码 Gitee 地址 1. 准备工作 1.1 建表 1.2 引入 MyBatis-plus 依赖 1.3 配置数据库连接 1.4 项目架构 2. 实体类准备 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 统一响应结果类 - Result 2.3.2 用户登录响应类 2.3.3…

从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全

安科瑞顾强 近年来&#xff0c;老旧小区电气火灾事故频发&#xff0c;成为威胁居民生命财产安全的重要隐患。据统计&#xff0c;我国居住场所火灾伤亡人数远超其他场所&#xff0c;仅今年一季度就发生8.3万起住宅火灾&#xff0c;造成503人遇难。这些建筑多建于上世纪&#x…

【深入浅出 Git】:从入门到精通

这篇文章介绍下版本控制器。 【深入浅出 Git】&#xff1a;从入门到精通 Git是什么Git的安装Git的基本操作建立本地仓库配置本地仓库认识工作区、暂存区、版本库的概念添加文件添加文件到暂存区提交文件到版本库提交文件演示 理解.git目录中的文件HEAD指针与暂存区objects对象 …