【数据库】聊聊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.rhkb.cn/news/237749.html

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

相关文章

企业级大数据安全架构(三)修改集群节点hostname

作者&#xff1a;楼高 在后续安装FreeIPA的过程中&#xff0c;要求机器名必须包含完整的域名信息。如果之前在Ambari集群节点上的机器名不符合这个要求&#xff0c;可以按照以下步骤在Ambari上修改所有节点的机器名&#xff1a; 1.部署节点说明 本次测试是三台 ambari 节点&…

迅为RK3568开发板Android11/12/Linux编译驱动到内核

在平时的驱动开发中&#xff0c;经常需要在内核中配置某种功能&#xff0c;为了方便大家开发和学习&#xff0c;本小 节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。 Android11 源码如果想要修改内核&#xff0c;可以运行以下命令进行修改: cd ke…

reactNative0.71版本的使用

开发环境配置 参考reactNative 官网 版本选中0.71 打包配置 1. IOS 打开项目 -> 进入ios目录->执行命令 pod install ->项目名称.xcworkspace -> 使用xcode打开->配置证书 证书配置截图如下 &#x1f4a1;tips&#xff1a;TARGETS目录下会有多个文件&#x…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

Hyperledger Fabric 通道配置文件解析

fabric 版本 v2.4.1 Fabric 网络是分布式系统&#xff0c;采用通道配置&#xff08;Channel Configuration&#xff09;来定义共享账本的各项行为。通道配置的管理对于网络功能至关重要。 通道配置一般包括通道全局配置、排序配置和应用配置等多个层级&#xff0c;这些配置都存…

在生产环境中使用uWSGI来运行Flask应用

安装uwsgi pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple安装不上则使用以下命令&#xff1a; conda install -c conda-forge uwsgi 当您成功安装uwsgi后&#xff0c;您可以通过以下步骤来测试uwsgi是否安装成功&#xff1a; 创建一个Python脚本&#xff…

Oracle11.2.0.4从RMAN备份中快速恢复单个表的方法

文章目录 前言一、查询所要恢复的表所涉及的表空间二、创建用于恢复的数据库三、恢复步骤1.恢复控制文件2.修改redo日志名称3.表空间恢复4.表空间recover5.查询数据 前言 由于用户误操作导致某表中的数据错乱&#xff0c;导致业务不能正常使用&#xff0c;现需要将该表恢复到一…

软件测试|MySQL BETWEEN AND:范围查询详解

简介 在MySQL数据库中&#xff0c;使用BETWEEN AND操作符可以进行范围查询&#xff0c;即根据某个字段的值在指定范围内进行检索数据。这个操作符非常有用&#xff0c;因为它可以让我们轻松地筛选出位于两个特定值之间的数据&#xff0c;而不需要使用复杂的条件语句。 BETWEE…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

金融帝国实验室(Capitalism Lab)V10版本游戏平衡性优化与改进

即将推出的V10版本中的各种游戏平衡性优化与改进&#xff1a; ————————————— 一、当玩家被提议收购一家即将破产的公司时&#xff0c;显示商业秘密。 当一家公司濒临破产&#xff0c;玩家被提议收购该公司时&#xff0c;如果玩家有兴趣评估该公司&#xff0c;则无…

鸿蒙开发-UI-布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 文章目录 前言 一、布局概述 1.布局结构 2.布局元素组成 3.布局分类 …

【数据结构】树和二叉树堆(基本概念介绍)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 前言 树的概念 树的常见名词 树与…

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 固件打…

MySQL主从复制配置(双主双从)

一、架构规划 一主多从可以缓解读的压力&#xff0c;但是如果主宕机了&#xff0c;所有从都不能写了&#xff0c;因此我们配置双主双从。 1、规划图 master1和master2互为主从关系&#xff0c;slave1是master1的从&#xff0c;slave2是master2的从。 2、环境准备 准备四台机…

LeetCode-1822/1502/896/13

1.数组元素积的符号&#xff08;1822&#xff09; 题目描述&#xff1a; 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组…

c++多久会被Python或者新语言取代?

c多久会被Python或者新语言取代&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

多传感器融合SLAM数学学习历程

多传感器融合SLAM数学学习历程 >>> 流形和流形空间&#xff08;姿态&#xff09; https://blog.csdn.net/professor_Xie/article/details/131911894 fast-lio 带着问题 看知识 欧式空间和流形空间的区别和联系? 基本结构&#xff1a;欧式空间是我们熟悉的传统三维…

机器学习笔记:时间序列异常检测

1 异常类型 1.1 异常值outlier 给定输入时间序列&#xff0c;异常值是时间戳值其中观测值与该时间序列的期望值不同。 1.2 波动点&#xff08;Change Point&#xff09; 给定输入时间序列&#xff0c;波动点是指在某个时间t&#xff0c;其状态在这个时间序列上表现出与t前后…

jmeter如何做接口测试?

Jmeter介绍&测试准备&#xff1a; Jmeter介绍&#xff1a;Jmeter是软件行业里面比较常用的接口、性能测试工具&#xff0c;下面介绍下如何用Jmeter做接口测试以及如何用它连接MySQL数据库。 前期准备&#xff1a;测试前&#xff0c;需要安装好Jmeter以及jdk并配置好jdk环…

STM32 1位共阳极数码管

数码管分为共阳极和共阴极&#xff0c;即多个二极管的同一端接到GND/Vss&#xff08;若一起接到GND&#xff0c;则称为共阴极。若一起接到Vss&#xff0c;则称为共阳极&#xff09; 把数码管上的每个二极管一次标号对应a,b,c,d,e,f,g,dp。我们知道发光二极管一端正一端负&#…