MVCC

news2024/11/28 19:28:38

MVCC基本概念

当前读

当前读 : 读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁. 对于我们日常的操作.

如 : select....lock in share mode(共享锁) , select * for update , update ,insert,delete(排他锁) 都是一种当前读.

快照读

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

不同的事务隔离级别下不同

  • Read Committed(读已提交) : 每次select 都生成一个快照读
  • Repeated Read(可重复度) : 开启事务后 一个select语句才是快照读的地方(因为要保证以后读取的数据和事务开启时的数据是一致的,所以后面的select都读取的是第一个select语句的快照,并没有产生新的快照).
  • Serialiazble(串行化) : 快照读就会退化为当前读.

MVCC

MVCC 也就是多版本并发控制, 它是指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQl实现MVCC提供了一个非阻塞读的功能. MVCC的具体实现,还要依赖于数据库记录中的三个隐式字段,undo log 日志,readView.

数据库记录中的三个隐式字段

当我们创建一个表的时候,除了我们规定的字段比如上面那张表有id,age,name. InnoDB引擎还会为我们创建2个或者3个隐式字段.

DB_TRX_ID : 代表最近修改的事务ID. 记录 插入这条记录 或者是 最后一次修改该记录的 事务ID -->是自增的

也就是说当我们插入这条记录或者修改这条记录,InnoDB存储引擎都会为这个DB_TRX_ID进行赋值.

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

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

只有表结构没有指定主键的时候,这个隐式字段DB_ROW_ID 才会生成.

undo log日志 , undo log 版本链

undo log 日志

回滚日志->undo log ,在insert update的时候产生的便于数据回滚的日志.(undolog日志记录的就是数据变更之前的记录情况)

当事务提交的时候或者该事务被回滚之后,undo log 日志就会有可能被删除.

什么时候这个undo log日志会被删除 ? 什么时候不会被删除呢?

  • 当insert的时候,产生的 undo log 日志只在回滚的时候需要,在事务提交后,会被立即删除
  • 而update,delete的时候,产生的undo log 日志不仅会在回滚的时候需要,在快照读的时候也需要,不会被立即删除

undo log 版本链

undo log版本链就是为了发生异常时,进行回滚形成的一个链表,然后根据某些规则最终决定回滚到哪个版本.

所以, 不同事务或者相同事务对同一条记录进行修改,每次修改的时候就会更新DB_TRX_ID(事务ID)和DB_ROLL_PTR(回滚指针),当有活动事务的时候,undolog里面的记录不能被删除,每个事务修改之后就会用DB_ROLL_PTR回滚指针串联起来形成一个undolog版本链.就会导致该记录的undolog生成的一条记录版本链表,记录了该记录的所有历史版本, 链表的头部就是最新的就记录,链表的尾部就是最早的旧记录.

readView

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

readView主要包含以下四个字段 :

快照读MVCC提取数据的时候就是依据上面这四个字段.

版本链数据访问规则

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

  • Read Committed : 在事务中每一次执行快照读时生成ReadView
  • REPEATABLE READ : 仅在事务第一次执行快照读的时候生成ReadView,后续复用ReadView

MVCC原理(RC级别)

在事务中每一次执行快照读时生成ReadView

因为所有事务执行完成之后,都会生成一个undolog版本链,每一次执行快照读时生成ReadView(RC隔离级别下),所以我们就可以根据readview里面的信息沿着undolog版本链依次与版本链数据访问规则进行比对,看符合哪条规则,如果符合版本链数据访问规则中的某一条,就把该历史版本返回

MVCC原理(RR级别)

仅在事务第一次执行快照读的时候生成ReadView,后续复用ReadView

参考 : 黑马程序员 MySQL视频黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili

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

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

相关文章

「Cpolar」使用Typecho搭建个人博客网站【内网穿透实现公网访问】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

Spring学习小结

文章目录1 BeanFactory与ApplicationContext的关系2 Spring基础环境下,常用的三个ApplicationContext3 Spring开发中Bean的配置4 Bean的初始化和销毁方法配置5 Bean的实例化配置6 Bean的依赖注入之自动装配7 Spring 的 xml 标签(默认、自定义&#xff09…

硬件语言Verilog HDL牛客刷题 day09 哲K部分

1.VL59 根据RTL图编写Verilog程序 1.题目: 根据以下RTL图,使用 Verilog HDL语言编写代码,实现相同的功能,并编写testbench验证功能 2.解题思路 2.1 了解D触发器的知识 (在时钟是上升沿的时候, 输入是什么…

UE “体积”的简单介绍

目录 一、阻挡体积 二、摄像机阻挡体积 三、销毁Z体积 四、后期处理体积 一、阻挡体积 你可以在静态网格体上使用阻挡体积替代碰撞表面,比如建筑物墙壁。这可以增强场景的可预测性,因为物理对象不会与地面和墙壁上的凸起细节相互作用。它还能降低物理模…

visio的使用技巧

一、调节箭头方向 1.打开你要修改的Microsoft Visio文件 2.选中你要修改的箭头,在上方的开始工具栏中找到“线条”选项,鼠标左键单击打开; 3.在下面找到“箭头”这个选项,鼠标移到上面去,就会展开;带阴影的…

Linux网络编程 第七天

目录 网络编程阶段项目 项目目标 Web服务器开发准备 Html语言基础 Html简介 Html标签介绍 题目标签 文本标签 列表标签 图片标签 超链接标签 http请求消息 请求类型 http响应消息 http常见状态码 http常见文件类型分…

“万物智联·共数未来”2023年移远通信物联网生态大会圆满落幕

4月12日,以“万物智联共数未来”为主题的2023年移远通信物联网生态大会在深圳前海华侨城JW万豪酒店隆重举办。 大会邀请到来自运营商、主流芯片商、行业客户、产业协会、标准联盟、媒体等产业链合作伙伴的40多位行业大咖,共话物联网产业的现在和未来。参…

node开通阿里云短信验证服务,代码演示 超级详细

阿里云官网步骤:Node.js SDK (aliyun.com) 首先先搭建一个node项目:app.js const express require(express); // 引入 Express 框架const app express(); app.use(express.json()); // 解析请求中的 JSON 数据const PORT process.env.PORT || 3000; …

URL 以及 URLConnection 类的使用

1. 概述 java 提供了两个类,在这两个类里封装了大部分 Web 相关的各种操作。这两个类是 URL 类 和 URLConnection 类。2. URL 类 java.net.URL 类定义了一个统一的资源定位器,它是指向互联网“资源”的指针。可以定 位互联网上的资源。并且…

LInux一天10题 day1

su(switch user) 命令用于更改其他使用者身份, usermod -l 修改账号名称,使用格式:usermod -l new_name old_name 修改用户权限: 方法1 1、先切换到root权限的用户登录下,修改 /etc/sudoers 文件,找…

games103——作业1

实验一主要实现简单的刚体动画模拟(一只兔子),包括 impulse 的碰撞检测与响应,以及 Shape Matching方法。 完整项目已上传至github。 文章目录简单刚体模拟(不考虑碰撞)平移运动旋转运动粒子碰撞检测与响应碰撞检测碰撞响应Penalty MethodsQuadratic Pen…

如何安全的从硬盘恢复文件?

可以从硬盘中恢复永久删除的文件吗? “我删除了一些看起来不重要的文件夹,并清空了回收站。但在几天后,我意识到删除的文件夹里有些重要的数据。如何恢复永久删除的文件?谢谢!” 随着科技的进步与发展&#xff0c…

LeetCode 2404. 出现最频繁的偶数元素

原题链接:2404. 出现最频繁的偶数元素 给你一个整数数组 nums ,返回出现最频繁的偶数元素。 如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回 -1 。 示例 1: 输入:nums …

OpenAI团队抢着用的编程语言?

作为一名合格的(准)程序员,必做的一件事是关注编程语言的热度,编程榜代表了编程语言的市场占比变化,它的变化更预示着未来的科技风向和机会! 快一起看看本月排行有何看点: 4月Tiobe排行榜前15…

如何学习智能交通?

AI的专业领域知识是指AI与具体应用领域相结合时所需要的该应用领域的知识。AI的应用领域非常广泛,例如计算机视觉、智能交通、智能制造、智慧金融、智慧教育、智慧农业、智慧能源、智能通信、智能芯片等。本文主要介绍智能交通的基本概念、发展历程、主要研究内容、…

DAMA数据治理认证,一定要先考CDGA才能考CDGP吗?

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

react4:配置网络请求axios --- 配置@路径别名

1. axios 请求安装:npm i axios axios 二次封装:配置,拦截器等应用 在:utils文件夹下request.js中配置 //utils文件夹下request.js中配置//导入 axios import axios from "axios";//实例化axios var service axios.create({time…

QT5学习教程一——Hello World例子

一、打开 Qt Creator -文件-新建文件或项目-Application-Qt Widgets Application-选择,如图 1.1 图 1.2 将项目放到指定目录,便于管理。单击[下一步] 选择构建的环境,可以根据自己的配置来选择,本例子选择MSVC2015。MSVC是指微软的…

JAVA阶段考内容知识点的梳理

前言:这些都是很基本的,还有很多没有写出来,重点在于编程序理解。 目录 第一章概述 课堂总结 相关习题 第二章:语言基础 课堂总结 相关习题 第三章:类和对象 内容总结 相关习题 第四章:类的派生与…

【Linux】网络编程套接字(下)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…