搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
菜鸟追梦旅行
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
CentOS 搭建Kafka集群_centos8 kafka容器集群部署方案
2
多进程编程(四):共享内存_多进程 shared
3
软件测试怎么学?App自动化、Web自动化、性能测试怎么学?一文总结_web自动化,app自动化,接口自动化,ui自动化,性能测试都要会吗
4
Flask-SQLAlchemy操作数据库_flask sqlalchemy 操作数据库
5
C语言结构体实现简单通讯录管理系统_大一c语言通讯录管理系统
6
AI、AGI、AIGC、AI Agent、Prompt、LLM 名词解释_aigc和llm的区别
7
2023-2024云计算省赛样题整理2_调整 memcached 的数据摘要算法(hash)为 md5;
8
Java 多线程(五)——线程通信(共享内存、管道流、wait()、notify()等)
9
一、python入门、python环境安装--附代码案例_代码安装python
10
STM32寄存器的简介、地址查找,与直接操作寄存器_stm32寄存器地址
当前位置:
article
> 正文
MySQL底层的MVCC与BufferPool缓存机制_mysql的buffer pool带事务吗
作者:菜鸟追梦旅行 | 2024-05-16 00:05:40
赞
踩
mysql的buffer pool带事务吗
MVCC
(
Multi-Version Concurrency Control
多版本并发控制)
Mysql在可重复读隔离级别下如何保证事务较高的隔离性,
同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。
对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。
Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。
undo日志版本链
undo日志版本链是指一行数据被多个事务依次修改数据后,在每个事务修改完后,MySQL会保留修改前的数据,万一事务失败需要回滚,可直接回滚到修改前的版本数据,相当于回滚日志,用两个隐藏字段 trx_id (事务id)和 roll_pointer(回滚指针)把这些日志串联起来形成一个历史记录版本链。在事务还没有提交,的时候只是对Buffer Pool里的数据进行修改的时候,就会提前写入undo日志记录更新前的数据。
在
RR隔离级别,
当事务开启,执行任何查询sql的时候(
并不是开启事务的时候
),会生成当前事务的
一致性视图read-view,
这个视图为此时看到的所有活跃未提交的事务id数组 额外加上 已创建的最大事务id组成,例如:readview:[100,150,200] ,300;在此隔离级别下,此事务内不论执行多少次查询sql,此视图值都已经固定了,不会变动。
如果在RC隔离级别下,则是每执行一次查询SQL就会实时更新一次。
事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-viw做比对,从而得到最终的快照结果。从最新的数据信息的事务id拿到视图中开始比对,如果 落在 活跃未提交的 事务id数组中,则表示为不可见的数据,会按照链条继续往下查找,直到找到最新 且并不属于 活跃未提交事务的数据为止!
版本链比对规则:
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 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。
数据删除:
对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的 trx_id,同时在该条记录的头信息(record header)里的(deleted_flag)标记位写上true,来表示当前记录已经被 删除,在查询时按照上面的规则查到对应的记录如果delete_flag标记位为true,意味着记录已被删除,则不返回数据。
注意:
begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB表的语句, 事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。
Innodb引擎SQL执行的BufferPool缓存机制
为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL了?
因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。 Mysql这套机制看起来复杂,但它可以保证每个更新请求都是
更新内存BufferPool
,然后
顺序写日志文件
,同时还能 保证各种异常情况下的数据一致性。
更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件。
正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几干的读写请求。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/575634
推荐阅读
article
一个
C++
实现的线程池 -
C++
Thread
Pool
...
本文介绍了
一个
基于现代
C++
实现的线程池项目,代码已开源在Github。
一个
C++
实现的线程池 -
C++
Thre...
赞
踩
article
Ubuntu
离线
安装
MySQL
5.7
.9_
uabntu
离线
安装
mysql
5.7
...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。_
uabntu
离线
安装
mysql
5.7
uabnt...
赞
踩
article
Ubuntu离线
安装
MySQL
5.7
_
ubuntu
离线
安装
mysql
5.7
...
注意:UFW防火墙开发 3306端口,UFW处于 Status: inactive 时(sudo ufw status ...
赞
踩
article
如何在安卓手机
Termux
上安装
MariaDB
(
MySQL
)并实现远程连接
数据库
_
locate
pa...
Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一...
赞
踩
article
物联网数据处理技术
课程设计
——基于
python
实现的智能
图书
馆借阅
管理系统
(
OpenCV
+
MySQL
...
语言环境:Python数据库:Mysql开发工具:VScode。_
图书
管理系统
python
图书
管理系统
python
...
赞
踩
article
注册
和
登录
python
实现_
python
mysql
登录
注册
界面...
一、构成
注册
-> 数据库 ->
登录
二、代码实现import hashlibimport py
mysql
def user...
赞
踩
article
Python
—
MySQL
...
文章目录数据库管理系统-DBMS(Database Management System)一、安装
MySQL
二、
MySQL
...
赞
踩
article
【
mysql
】
深入
探索
mysql
中
的
各种
约束条件
...
在
mysql
中对编辑
的
数据进行类型
的
限制,不满足
约束条件
的
报错【
mysql
】
深入
探索
mysql
中
的
各种
约束条件
...
赞
踩
article
@
Prometheus
监控
数据库(
MySQL
)_
mysql
expoert
普
米修斯
...
监控
远程
mysql
服务一、被
监控
点部署
mysql
_exporter1、下载[root@web02 /opt]# wget...
赞
踩
article
Prometheus 的云上 MySQL
监控
实践_
mysql
_
global
_
status
_
slow
...
Created_tmp_disk_tables:表示为创建磁盘临时表数量,对应输出
监控
指标为:
mysql
_
global
_...
赞
踩
article
Prometheus
运维十 监控
MySQL
_
prometheus
mysql
questions...
帮助文档:http://www.eryajf.net/2499.html
prometheus
监控
MySQL
需要用到mys...
赞
踩
article
Prometheus
监控
Redis
集群,
Mysql
并显示到
Granfana
仪表盘
_red...
prometheus
监控
redis
集群并显示到granfana面板_
redis
仪表板
监控
redis
仪表板
监控
...
赞
踩
article
my
sql
/etc/
my
.
cnf
配置
详解_
my
sql
的
my
.
cnf
...
my
sql
/etc/
my
.
cnf
配置
详解_
my
sql
的
my
.
cnf
my
sql
的
my
.
cnf
/...
赞
踩
article
MySQL
配置文件
my
.
cnf
/
my
.ini 逐行详解_
my
sql
配置文件
(
my
.
cnf
或m...
充分理解
MySQL
配置文件
中各个变量的意义对我们有针对性的优化
MySQL
数据库性能有非常大的意义。我们需要根据不...
赞
踩
article
windows
MySQL5.7
my
.
cnf
位置_
windows
my
sql
my
.
cnf
...
my
sql
my
.
cnf
位置_
windows
my
sql
my
.
cnf
windows
my
sql
my
.
cnf
...
赞
踩
article
Mysql
多表
查询详解_
mysql
多表
查询...
纸上得来终觉浅1.前言:上篇讲到
Mysql
中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多...
赞
踩
article
mysql
多表
查询的分类_
navicat
for
mysql
多表
查询的分类...
内连接等值连接非等值连接自连接外连接inner join等值连接非等值连接自连接外连接_
navicat
for
mysq...
赞
踩
article
MySql
事务
...
一组操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性。**原子性(Atomicity):**当前的
事务
要么...
赞
踩
article
mysql
多表
查询
语句_
mysql
多表
查询
语句...
多表
查询
语句_
mysql
多表
查询
语句
mysql
多表
查询
语句 -- 隐式内连接 SELECT 字段...
赞
踩
article
Flask
+
MySQL
+
ECharts
实现地名
关系
图谱_
flask
实现
关系
拓扑图
...
先上数据结构表功能点1、所有地名
关系
动态图2、将鼠标放到节点上会从数据库中把地名介绍显示3、点击左侧边栏城市名称可把响应...
赞
踩
相关标签
c++
数据库
ubuntu
mysql
android
智能手机
课程设计
python
opencv
Python
MySQL
PyMySQL
mysql约束
约束条件
prometheus
linux
运维
监控类
大数据