MVCC

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java对象模型

介绍 Java是一种面向对象的语言,而Java对象在JVM中存储是由一定结构的。而这个 Java对象自身的存储模型称之为Java对象模型HotSpot虚拟机中,设计了一个OOP-Klass Model.OOP指的是普通对象指针,而Klass用来描述对象的具体类型。如下图所示是一…

文章生成器写出来的原创文章

文章生成机器人 文章生成机器人是一种基于人工智能技术和自然语言处理算法的程序,可以自动地生成高质量、原创的文章。 文章生成机器人的优点如下: 提高工作效率:文章生成机器人能够在较短的时间内自动帮助用户生成大量的文章,提…

Python 小型项目大全 21~25

二十一、DNA 可视化 原文:http://inventwithpython.com/bigbookpython/project21.html 脱氧核糖核酸是一种微小的分子,存在于我们身体的每个细胞中,包含着我们身体如何生长的蓝图。它看起来像一对核苷酸分子的双螺旋结构:鸟嘌呤、…

计算机网络微课堂1-3节

目录 1. TCP/TP协议​编辑 2. 3.调制解调器 4.因特网的组成 5.电路交换 6.分组交换 重要常用 7.报文交换 8.总结电路交换 报文交换和分组交换 9. 1. TCP/TP协议 2. ISP 网络提供商 ISP的三层 国际 国家 和本地 3.调制解调器 什么是调制解调器,它存在的…

Python 小型项目大全 11~15

十一、标题党生成器 原文:http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告!但是想出有创意的原创内容太难了。幸运的是,有了标题党生成器,我们可以让一台计算机产生数百万个令人发指的…

【Linux】浅析Input子系统

文章目录1. 框架1.1 数据结构1.2 evdev_handler1.3 evdev_init1.4 input_register_handler2. 应用如何打开节点并读取到事件数据2.1 evdev_fops2.2 evdev_open2.3 evdev_release2.4 evdev_read2.5 evdev_write2.6 evdev_poll2.7 evdev_fasync2.8 evdev_ioctl2.9 evdev_ioctl_co…

[考研数据结构]第3章之栈的基本知识与操作

文章目录 栈的基本概念 栈的实现 顺序栈 共享栈 链栈 栈的基本概念 栈的定义 栈(Stack)是只允许在一端进行插入或删除操作的线性表 相关术语 栈顶(Top)线性表允许进行插入或删除的那一端称之为栈顶栈底(Bottom&…

【计算机网络-数据链路层】集线器、网桥、交换机

本文许多文字和图片使用了湖科大教书匠(高军老师)的 PPT,在此表示感谢。正是他让非科班的我能以奇妙的方式走进网络的世界。 文章目录1 【物理层】集线器(Hub)——共享式以太网1.1 为什么使用集线器?1.2 集…

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

ESXI 6.7全面系统教程~汇总

ESXI 6.7全面系统教程 许可证:0A65P-00HD0-375M1-M097M-22P7H esxi 是一个脱机系统,也是一个虚拟机系统与vmware 相比,它可以直接运行在硬件上,这样可以减少资源浪费,一般用于服务器上;下面是esxi 的完整…

stable-diffusion-webui-colab部署记录

stable-diffusion-webui-colab 该模型可以在网上云端部署stable-diffusion,减少本地部署的繁琐步骤降低配置要求的依赖。 一、进入stable-diffusion-webui-colab 1.网址:https://github.com/camenduru/stable-diffusion-webui-colab 在分支中选择driv…

我的创作纪念日:Unity CEO表示生成式AI将是Unity近期发展重点,发布神秘影片预告

PICK 未来的AI技术将会让人类迎来下一个生产力变革,这其中也包括生成型AI的突破性革新。各大公司也正在竞相推出AIGC工具,其中微软的Copilot、Adobe的Firefly、Github的chatGPT等引起了人们的关注。然而,游戏开发领域似乎还没有一款真正针对性…

Vulnhub:Digitalworld.local (Development)靶机

kali:192.168.111.111 靶机:192.168.111.130 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 查看网站首页源码 访问development目录,提示存在一个流量包 查看流量包发现另一个网站路径:/devel…

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中,而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承,这也是 Java语言的精髓所在。Java语言提供了一种机制,叫做派生类。在 Java中,如果没有实现了某个派生类方…

python 调用c++

python中调用c,函数参数用 int类型,返回值为类型1,且返回值为 false。 注意:如果你使用了C中的 false,则返回的是-1。 在 Python中调用C时,你会得到一个名为 bool的类,其中包含了两个成员变量: …

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型(only 2 pages)3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识(only 1 page)五…

SpringCloud-Gateway网关搭建整合nacos配置中心实现动态路由整合sentinel实现服务限流熔点降级

官方文档(更多配置详情直接查看官方文档) 为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 (1)病毒 概念:病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地&#xff0…

MySQL库的操作

文章目录:创建数据库字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响操作数据库查看数据库显示创建语句修改数据库删除数据库数据库的备份和还原表的备份和还原查看连接情况创建数据库 …

数据库基础

文章目录前言一、什么是数据库二、主流数据库三、基本使用1.连接服务器2.服务器,数据库,表关系3.使用案例4.数据逻辑存储四、MySQL架构五、SQL分类六、存储引擎1.存储引擎2.查看存储引擎3.存储引擎对比总结前言 正文开始!!! 一、什么是数据库 存储数据用文件就可以了,为什么还…