【数据库】聊聊MVCC机制与BufferPool缓存机制

上一篇文章,介绍了隔离级别,MySQL默认是使用可重复读,但是在可重复读的级别下,可能会出现幻读,也就是读取到另一个session添加的数据,那么除了配合使用间隙锁的方式,还使用了MVCC机制解决,保证在可重复读的场景下,同一个session读取的数据一致性。

mvcc机制

MVCC(Multi-Version Concurrency Control) 多版本并发控制机制,对同一行数据的读和写操作默认不会加锁互斥保证隔离型,提高性能,而串行化隔离级别为了保证较高的隔离型是将所有操作通过互斥来实现的。

Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。

原理

其实undo日志链是指一行数据被多个事务依次修改过后,每个事务修改完后,mysql都会保留修改前的数据undo 回滚日志,并且添加两个隐藏字段trx_idroll_pointer 将undo日志链串联形成一个历史记录版本链。 通过数据快照的方式。关键核心是undo日志和readView

什么时候会生产trx-id ?
在begin transaction的时候并不会新建,在执行到他们之后的第一个修改操作InnoDB表的语句的时候,事务才真正启动,向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的

在这里插入图片描述

一个案例

在这里插入图片描述

mysql> CREATE TABLE `t` (`id` int(11) NOT NULL,`k` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, k) values(1,1),(2,2);

在这里插入图片描述
最终结果事务A读取的是1,而事务B读取的是3。为什么是这样,我们来分析一下。

在这里插入图片描述
假设在事务A开始的时候只有一个transaciton id = 1, 那么事务A就是2,事务B就是3,事务C就是4.

事务A的试图数组就是[1,2] 事务B视图数组[1,2,3] , 事务C视图数组[1,2,3,4];
当事务C进行修改k=k+1 ,就将id=1的k 设置为2。但是接着事务B也加1操作,此时事务B的+1操作其实是当前读,也就是获取最新的数据,k=2, 在k=2的基础上+1 操作,那么k=3。所以事务B的K值事3。但是事务A的视图数组[1,2] 查询undo日志链,发现 【3,4】都查看不了,所以k=1;

对比规则

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;

  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);

  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见

一个简易的版本就是

  • 版本未提交,不可见;
  • 版本已提交,但是是在视图创建后提交的,不可见;
  • 版本已提交,而且是在视图创建前提交的,可见。

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取 同一条数据在版本链上的不同版本数据。

不同的读操作

select * from table where ?; 
select * from table where ? lock in share mode; # 加读锁 select * from table where ? for update;# 加写锁
insert into table values (...);# 加写锁
update table set ? where ?;# 加写锁
delete from table where ?;# 加写锁
# 所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他并发 事务不能修改当前记录,对读取记录加锁。
# 其中,除了第一条语句,对读取记录加读锁外,其他的操作都加的是写锁。

在这里插入图片描述
那么思考一个逻辑。如果一个事务A 对id=1更新操作的时候,还没有提交,那么事务B也对id=2更新操作,会出现什么情况?

答案就是会阻塞事务B,必须等事务A执行完毕。

在这里插入图片描述

bufferpool缓存

在这里插入图片描述
在我们更新一条SQL数据的时候,大概流程如下
1.构建连接、查询缓存、分析器、优化器、执行器
2.在执行器的时候

  • 如果buffer pool有对应的页数据,直接获取,否则从磁盘加载对应的id=1的数据 name=zhuge。
  • 将name=‘zhuge’ 进行写入undo日志文件中,(主要方式如果事务进行回滚的话,可以直接恢复数据)
  • 更新内存中的buffer pool的数据 name=‘zhuge 666’
  • 写入redo log日志。准备阶段。 (系统宕机,用于恢复数据 重做)
  • 写入bin log日志,然后提交事务。

我们来思考下,为什么需要设计一套这么复杂的,因为主要是对于磁盘的操作是随机IO性能不高,可以通过写入LOG文件,提升性能。先更新到BufferPool中,然后顺序写日志文件。也可以保证各种异常情况下数据的一致性。

几个小问题?
1.脏页刷盘的时机?(大概四种 a.redolog满了 binnodl buffer满了 c:myg!正常关闭 d.mysql空闲)
2.如果数据库突然奔溃了,没刷盘的数据是不是就丟了?(不会,redolog防崩溃)
3.如果redo.log没写入磁盘,这时候这部分事务是不是数据就丢了(redolog buffer 里的数据丢了怎么办,redolog buffer记录的是 事务prepare阶段数据(未提交 丢了无所谓))
4.如果redolog在刷盘的时候断电呢。

总结

MySQL的事务是如何保证的,我们用了两篇文章进行详细描述,通过ACID,其中AID是为了保证C。
(隔离性):MVCC原理、(原子性):innodb 事务二阶段提交、D(持久性):事务提交后的数据落盘。以及通过相关的锁机制,来保证。

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

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

相关文章

DSL查询文档--查询结果处理

排序 elasticsearch默认是根据相关度算分&#xff08;_score&#xff09;来排序&#xff0c;但是也支持自定义方式对搜索结果排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 普通字段排序 keyword、数值、日期类型排序的语法基本一…

SSH远程访问与控制

ssh优点 数据传输是加密的&#xff0c;可以防止信息泄露 数据传输是压缩的&#xff0c;可以提高传输速度 作用 sshd 服务使用 SSH 协议可以用来进行远程控制&#xff0c;或在计算机之间传送文件。 ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务&#xff08;文件传…

对C语言的理解

1.计算机语言 就是我们人类与计算机进行交流的媒介。我们可以使用编程语言对计算机下达命令&#xff0c;从而让计算机完成我们所需要的功能。 语言 语法 逻辑 计算机语言有很多种。如&#xff1a;C 、C、Java、Go、JavaScript、Python&#xff0c;Scala等。 2.计算机语言简史…

宠物空气净化器品牌推荐哪个牌子好?五款猫用空气净化器高质量推荐品牌

养宠人家里除了猫粮、猫砂和罐头等必备的日常用品外&#xff0c;宠物空气净化器也是必需的。它可以在我们不方便开窗通风的日子里&#xff0c;有效净化室内空气&#xff0c;并且能够有效减少动物皮屑引起的过敏反应。然而&#xff0c;面对市场上琳琅满目的新款空气净化器、功能…

Webpack模块打包工具

目录 Webpack模块打包工具知识点自测01.Webpack 简介以及体验目标讲解小结 02.Webpack 修改入口和出口目标讲解小结 03.案例-用户登录-长度判断目标讲解小结 04.Webpack 自动生成 html 文件目标讲解小结 05.Webpack-打包 css 代码目标讲解小结 06.优化-提取 css 代码目标讲解小…

浅谈对Maven的理解

一、什么是Maven Maven——是Java社区事实标准的项目管理工具&#xff0c;能帮你从琐碎的手工劳动中解脱出来&#xff0c;帮你规范整个组织的构建系统。不仅如此&#xff0c;它还有依赖管理、自动生成项目站点等特性&#xff0c;已经有无数的开源项目使用它来构建项目并促进团队…

C++ Webserver从零开始:基础知识(三)——Linux服务器程序框架

目录 前言 一.服务器编程基础框架 C/S模型 主要框架 二.I/O模型 阻塞I/O 非阻塞I/O 异步I/O 三.两种高效的事件处理模式 Reactor Proactor 四.模拟Proactor模式 五.半同步/半异步的并发模式 六.有限状态机 七.其他提高服务器性能的方法 池 数据复制 上下文切换…

浅谈缓存最终一致性的解决方案

浅谈缓存最终一致性的解决方案 作者&#xff1a;clareguo&#xff0c;腾讯 CSIG 后台开发工程师 来源&#xff1a;腾讯技术工程open in new window 到底是更新缓存还是删除缓存? 到底是先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存&#xff0c;再更新数据…

非常非常实用!不能错过,独家原创,9种很少人听过,但却实用的混沌映射!!!以鲸鱼混沌映射为例,使用简便

很多人在改进的时候&#xff0c;想着增加混沌映射&#xff0c;增加初始种群的多样性&#xff0c;可是&#xff0c;大多数论文中常见的映射&#xff0c;都被别人使用了&#xff0c;或者不知道被别人有没有使用&#xff0c; 本文介绍9种很少人知道&#xff0c;但非常实用混沌映射…

线性调频信号的解线调(dechirp,去斜)处理matlab仿真

线性调频信号的解线调 线性调频信号的回波模型参考信号去斜处理去斜处理傅里叶变换得到脉压结果解线调仿真总结 线性调频信号的回波模型 对于线性调频脉冲压缩雷达&#xff0c;其发射信号为&#xff1a; s ( t ) r e c t ( t T ) e x p ( j π μ t 2 ) \begin{equation} s(…

强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

等保测评流程是什么样的?测评周期多久?

等保测评流程是什么样的&#xff1f;测评周期多久&#xff1f; 等保测评一般分成五个阶段&#xff0c;定级、备案、测评、整改、监督检查。 1.定级阶段 针对用户的信息系统有等保专家进行定级&#xff0c;一般常见的系统就是三级系统或者是二级系统。在这里有一个小的区分&am…

[ACM算法学习] 诱导排序与 SA-IS算法

学习自诱导排序与SA-IS算法 - riteme.site 为了简化一些操作&#xff0c;定义 # 是字典序最小的字符&#xff0c;其字典序小于字母集里任意字符&#xff0c;并且将其默认作为每个字符串的最后一个字符&#xff0c;即作 S[|S|] SA-IS 算法 SA-IS 算法是基于诱导排序这种思想。…

【二、自动化测试】unittest测试框架简介

你好啊&#xff01;我是程序员山茶&#xff0c;你也可以称我为测试开发Guide。本文首发“unittest” 每个语言都包含有自己的测试框架&#xff0c;python中同样有很多测试框架&#xff0c;具体如下 unittest&#xff1a; unittest是Python自带的单元测试框架&#xff0c;它提供…

Docker安装Elasticsearch8详细步骤

前面讲了Elasticsearch7的安装步骤&#xff0c;今天讲讲Elasticsearch8的安装&#xff0c;大同小异。 1、配置环境变量 .env 文件设置运行 docker-compose.yml 配置文件时使用的环境变量。 确保使用 ELASTIC_PASSWORD 和 KIBANA_PASSWORD 变量为 elastic 和 kibana_system 用…

基于机器学习的高考志愿高校及专业分析系统

本项目在“基于 Python 的高考志愿高校及专业分析系统”基础上补充添加了机器学习算法对高考总问进行预测&#xff1b; 项目采用了网络爬虫技术&#xff0c;从指定的高考信息网站上抓取了各大高校的历年录取分数线数据。 通过精细的数据清洗过程&#xff0c;这些数据被存储于…

云计算任务调度仿真02

前面已经分享过一个仿真项目&#xff0c;但是基于policy gradient方法实现的&#xff0c;考虑到许多人从零到一实现DQN方法有点难度&#xff0c;所以这次分享一个基于DQN实现的仿真项目&#xff0c;非常简单。 这里之所以简单主要得益于它是用pytorch实现的&#xff0c;而pyto…

NLP论文阅读记录 - 2022 W0S | 基于Longformer和Transformer的提取摘要层次表示模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Hierarchical Representation Model Based on Longformer and …

Unity游戏图形学 Shader结构

shader结构 shader语言 openGL&#xff1a;SLG跨平台 >GLSL&#xff1a;openGL shaderlauguge DX&#xff1a;微软开发&#xff0c;性能很好&#xff0c;但是不能跨平台 >HLSL&#xff1a;high level shader language CG&#xff1a;微软和Nvidia公司联合开发&#xff…

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…