数据库的读写分离技术MVCC

news2024/11/15 14:08:18

本文纯理论学习,无知之处请给与包涵! 写作不易,觉得好,麻烦请点广告支持下 分享一下!
作者不支持读者的任何抽象行为,阅读本文产生的任何后果,作者概不负责

MVCC 英文全称叫多版本并发控制协议. 以前做ORACLE DBA时候没有听说过.后来转到MYSQL DBA就听说了. 另外还有个WAL,这个是POSTGRE SQL的叫法. 这些概念不就是早就实现过得呀! ORACLE REDO,先写日志,后写数据.凡是都要记录日志.ORACLE的日志量可大了, REDO要保护系统表空间,还有辅助表空间,用户表空间,以及UNDO表空间的数据改变前的向量.

ORACLE UNDO 没有听人说 UNDO实现了MVCC.老盖出了那么多书,好像也没有提过.也许我人老了记忆性差.
 

MVCC 包含两方面:

  1. Multi-Versioning,MV:生成多版本的数据内容,使得不同请求(读写)可以获取响应版本数据。

  2. Concurrency Control,CC:并发控制,使得并行执行的内容能保持串行化结果。

    并发控制,我怎么感觉不出来呢? 是在说读的并发控制吗? 读也需要并发控制吗? 我以为是用MUTE,LATCH等内存锁.
    难道是写的并发控制?  这有可能

    行的元组

    数据库中每个数据的数据头(Header)会包含数据的 metadata 信息,这些信息被称为行的元组

    图片

txn-id: 数据的TID,用以实现写锁。begin-ts & end-ts:标识该元组版本的生命起止时间。pointer:指向同一行数据相邻(新/旧)版的指针,依靠指针,版本数据可以形成一个单向链表

上面4个字段,只是意思意思下, ORACLE只有两个 一个锁标志,另外一个是回滚指针. MYSQL会多了些字段.完成是否可见性(ReadView) 查询活跃事务列表,判断本事务ID..


并发控制协议

并发控制协议解决的是不同事务间执行顺序和结果的问题(而不是多版本数据),也就是通过或者时间顺序保持事务读写数据的串行性 说白了就是修改事务,ORACLE的 DML语句 写的并发控制.论文介绍了四种协议:Timestamp OrderingTwo-phase Locking Concurrency Control Serialization Certifier 我在这里不介绍论文,太理论,太烧脑. 我们知道ORACLE直接在行头用锁控制

图片

ORACLE 通过行锁标志+块的事务槽完成DML事务的并发控制.

图片

多版本存储 读写分离核心

多版本存储技术决定了各种不同DB 读写分离实现细节
 
 1  表内存储和表外存储
 2  整行存储,修改列增量存储

ORACLE和MYSQL 采用 表外+列增量存储
SQL SERVER        采用 表外+整行存储
POSTGRE SQL     采用 表内+整行存储


表内+整行存储:

图片


即使数据行中只有少量字段发生了变更。另外,如果表中带有非内联数据,如BLOB、TEXT字段,即使事务没有修改它,也会导致引入大量的重复,导致表数据膨胀。Postgres表膨胀这样也是原因之一

   SQL SERVER        采用 表外+整行存储

图片

既然行版本控制,是通过在读写并发时,让读会话去读取历史行版本数据,从而避免阻塞等待,那么这些历史行数据,存储在什么地方?
答案是: tempdb 数据库!

ORACLE和MYSQL 采用 表外+列增量存储

图片

这种方案对于更新操作很理想,因为减少了内存的分配。但是对于偏向与读的场景负担大。当进行获取一个元组的多个属性的读操作时,数据库需要遍历版本链,必须从各个字段的版本数据链中获取到对应版本的字段值,再进行拼凑,这就带来了一定的额外开销。我们拿ORACLE 来说, 看图回滚指针存在块的头部,也就是说更新某行的某个列,就要修改块头的UNDO地址, 那么数据块有很多行,很多列.那么这个UNDO地址就修改很频繁. 这数据块的UNDO历史版本就很长. 当某个SELECT想要读取它需要的数据时候,需要遍历这个数据块的历史链条.越过很多不是该行的修改版本.

图片

为此这表外+列增量方式 还需要从当前块或者行来逆历史版本共同构造出CR块或者CR行

其实最佳的应该是SQLSERVER 表外+整行存储. 如果对TEXT,BLOB做下优化就完美了.如果没有修改TEXT,BLOB字段,那么就复制基本行去历史区域.
如果修改了就一起复制过去历史区域. 第一次做一下FULL PAGE.或者其它什么方式进行优化 或者在TEXT,BLOB页增加版本控制的字段.

最后就是 回滚覆盖
  
版本太长了是个问题, 不需要的旧版本应该清理掉. ORACLE 经典的错误

   Oracle ORA-01555
这在ORACLE 11G 以前是个头痛的事情,后来ORACLE根据查询最长时间的SELECT,指定回滚段保留时间,这又导致UNDO的膨胀.
它有三种状态来管理生命周期,分别是ACTIVE  UNEXPIRED EXPIRED,
活跃事务的段总是ACTIVE状态;
已完成事务的,但是在UNDO_RETENTION周期内的是UNEXPIRED状态;
已完成事务的UNDO,但已经过了UNDO_RETENTION保留周期的是EXPIRED状态。

图片

ORACLE 不用专门的程序去清理历史版本,而是采用覆盖重用的方式.

MYSQL 需要专门的线程去清理,它采用事务级别盯着活跃事务列表

图片

事务记录它读写数据行的集合,DBMS需要监控集合中的版本数据是否都过时了。当某个事务的版本数据集合对所有的活跃事务都不可见时,就可以将这个集合中的版本数据都进行清理。优点是数据库可以立即回收对应事务的所有存储空间,缺点是数据库要跟踪每个时期的事务读/写集

MySQL的 MVCC 主要依赖于:数据行中的隐式字段、undo log,consistent read view

undo log 中主要保存了数据的基本信息,比如说日志开始的位置、结束的位置,主键的长度、表id,日志编号、日志类型

图片

InnoDB存储引擎中的每行记录都包含一些隐藏字段,如DB_TRX_ID最后修改该行的事务ID、DB_ROLL_POINT 回滚指针

图片

当事务执行读写分离时,会产生一个ReadView,ReadView中包含了系统中活跃的事务ID列表。
通过比较ReadView与历史版本链中的DB_TRX_ID,可以确定哪个历史版本的数据对当前事务可见。数据库每次数据修改时,都会在undo log中留下快照,用于读取旧版本信息。

ReadView 其实就是一个保存事务ID的list列表。记录的是本事务执行时,MySQL还有哪些事务在执行,且还没有提交。

它主要包含这样几部分:

  • m_ids,当前有哪些事务正在执行,且还没有提交,这些事务的 id 就会存在这里;

  • min_trx_id,是指 m_ids 里最小的值;

  • max_trx_id,是指下一个要生成的事务 id。下一个要生成的事务 id 肯定比现在所有事务的 id 都大;

  • creator_trx_id,每开启一个事务都会生成一个 ReadView,而 creator_trx_id 就是这个开启的事务的 id。

这样在访问某条记录时,只需要按照下边的步骤判断该记录在版本链中的某个版本(trx_id)是否可见:
        1、trx_id < m_ids列表中最小的事务id
        表明生成该版本的事务在生成ReadView前已经提交,所以该版本可以被当前事务访问。
        2、trx_id > m_ids列表中最大的事务id
        表明生成该版本的事务在生成ReadView 后才生成,所以该版本不可以被当前事务访问。
        3、m_ids列表中最小的事务id ≤ trx_id ≤ m_ids列表中最大的事务id(可以取等于,感谢网友指出)
        此处比如m_ids为[5,6,7,9,10]
        ①、若trx_id在m_ids中,比如是6,可以分成2种情况

                a. creator_trx_id也是6,说明这条trx_id记录是当前事务产生的,可以被访问

                a. creator_trx_id不是6,说明这条trx_id记录不是当前事务产生的,并且创建 ReadView 时生成该版本的事务还是活跃的,该版本不可以被访问。
        ②、若trx_id不在m_ids中,比如是8:说明创建 ReadView 时生成该版本的事务已经被提交,该版本可以被访问。

一句话说:当trx_id在m_ids中且creator_trx_id != trx_id,或者大于m_ids列表中最大的事务id的时候,这个版本就不能被访问。

如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本,如果最后一个版本也不可见的话,那么就意味着该条记录对该事务不可见,查询结果就不包含该记录。

图片

图片

图片

MYSQL 依靠锁链完成事务的并发控制

图片

图片

图片

因此 MVCC 应该说是多版本读写分离

当然也可以这样说 MVCC 是多版本读写分离提升读并发的协议

基于MYSQL的JAVA初级优化措施
MYSQL RR隔离下加锁初步理解
MYSQL RC下加锁的初步理解
不会C/C++的不是好DBA,一个解析MYBAITS的脚本
架构DBA
终于搞明白64位LINUX页表问题
一段直接路径读取文件LINUX C代码

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

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

相关文章

Vastbase——单机安装部署

一、依赖软件环境检查 yum install -y zlib-devel libaio libuuid readline-devel krb5-libs libicu libxslt tcl perl openldap pam openssl-devel libxml2 bzip2 二、系统和环境配置 1.检测及关闭目标部署机器的防火墙 sudo firewall-cmd --state sudo systemctl status …

分布式数据一致性小结

文章目录 简介一、线性一致性二、顺序一致性三、因果一致性四、以客户端为中心的一致性参考 简介 分布式一致性问题包括数据一致性问题和事务一致性问题。在此仅关注数据一致性问题&#xff0c;数据一致性问题是因为分布式系统下数据需要复制而导致的。 而数据一致性模型就是…

关于使用Object.create(null)来创建空对象,而不直接使用{}的优势

文章目录 前言1. 使用Object.create(null) 和 直接{}的区别2.子类继承父类3. 子类继承父类---进阶 前言 问题&#xff1a;为什么vue源码中使用Object.create(null)来创建空对象&#xff0c;而不直接使用{}??? 1. 使用Object.create(null) 和 直接{}的区别 优势&#xff1a…

Qt:玩转QPainter序列四

前言 接着干源码 正文 先看源码&#xff0c;然后我们逐条分析 QPainter 是一个强大的绘图类&#xff0c;用于在 QWidget、QImage、QPixmap 等设备上进行绘图操作。下面我会详细解释你提到的各个函数和属性&#xff0c;并通过示例展示它们的用法。 1. font() 和 setFont() …

彻底改变音乐产业——人工智能如何实现利润最大化并重塑市场

引言 索尼音乐 收购 以惊人的 1 亿英镑收购了 Queen 的音乐目录。近年来&#xff0c;我们看到投资基金投入数亿美元收购 Justin Bieber、Bruce Springsteen、Katy Perry 等顶级艺术家的音乐版权。据 Cambridge Associates 称&#xff0c;从 2013 年到 2017 年&#xff0c;仅音…

.NET COER+CONSUL微服务项目在CENTOS环境下的部署实践

一、整体的环境安装与部署 1.1、DOCKER环境的部署 1.1.1 安装DOCKER yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast && yu…

python学习9-数据获取与整理5

有点是生成快&#xff0c;如果想炫酷 还是要前端生成&#xff0c;比如 echarts Matplotlib可视化 Matplotlib是Python中最重要的数据可视化库之一&#xff0c;它提供了多种绘图工具&#xff0c;可以生成各种硬拷贝格式和交互式环境下的多种平台上的图形。本文将详细讲解Matplo…

【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【python报错已解决】`Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;环境配置常常会引发一些难以预料的报错。如何快速定位并解决这些问题&#xff0c;成…

【C++ Primer Plus习题】5.6

问题: 解答: #include <iostream> using namespace std;#define MONTHSCOUNT 12 #define YEARS 3int main() {string months[MONTHSCOUNT] { "January","February","March","April","May","June","J…

10倍加速LLM计算效率:消失的矩阵乘

矩阵乘法&#xff08;MatMul&#xff09;是深度学习中的主要计算瓶颈&#xff0c;尤其在ChatGPT等Transformer模型中&#xff0c;矩阵乘法的运行时长约占其总运行时长的45-60%&#xff0c;解决这一挑战对发展更经济的大模型具有重要意义。 为此&#xff0c;加州大学的研究人员在…

服务器搭建记录(两台服务器通过一个路由器的LAN口联网)

目录 服务器搭建记录&#xff08;两台服务器通过一个路由器的LAN口联网&#xff09;操作步骤&#xff1a;一、安装N卡驱动二、安装cuda三、安装cudnn四、配置SSH五、为服务器创建新sudo用户账号六、安装docker和NVIDIA-docker七、通过联网路由器 遇到的一些问题&#xff1a;参考…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

【C++指南】类和对象(二)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注

【leetcode】学习计划 - 面试经典150题 - 二叉树系列1

面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09; 目录 二叉树 104. 二叉树的最大深度 100. 相同的树 226. 翻转二叉树 101. 对称二叉树 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 二叉树结构 // Definition for a bin…

SpringSecurity前后端分离代码

1. 搭建 SpringBoot工程 1) 新建 boot 项目 只要一个 web 依赖 创建好的初始目录&#xff0c;直接将 demos 包删除。 导入依赖 <!-- security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-se…

redis | 认识非关系数据库Redis的字符串数据类型及过期时间expire的作用

Redis 非关 kv型 数据类型字符串数值操作 应用场景 ⭐字符串命令练习⭐⭐过期时间设定 expire ⭐⭐⭐检查过期时间 ttl key删除过期key机制惰性删除定期删除 数据类型 数据类型丰富&#xff0c;字符串strings,散列hashes,列表lists&#xff0c;集合sets,有序集合sorted sets等等…

MySQL Order By 工作原理探究以及索引优化手段

背景 这篇文章出发的契机&#xff0c;主要是看到京东定时任务优化里面有使用到「游标」这种策略去完成查询优化 https://mp.weixin.qq.com/s/aYJV3Z-1MZ_a6tUjoHa_9g 刚好之前自己在开发业务的时候&#xff0c;也碰到类似的场景&#xff0c;需要在每个季度末将被申诉的卡片更…

流媒体协议之RTMP

一、RTMP 协议概述 今天我们要一起了解的这个协议叫 RTMP 协议&#xff0c;它并不复杂&#xff0c;对于拉流相关的协议&#xff0c;我们可以先思考一下拉流一般要交互什么&#xff0c;我理解有以下几项&#xff0c; 连接信息&#xff1a;包括服务器的地址、端口号等&#xff…

每日Attention学习16——Multi-layer Multi-scale Dilated Convolution

模块出处 [CBM 22] [link] [code] Do You Need Sharpened Details? Asking MMDC-Net: Multi-layer Multi-scale Dilated Convolution Network For Retinal Vessel Segmentation 模块名称 Multi-layer Multi-scale Dilated Convolution (MMDC) 模块作用 多尺度特征提取与融合…