TiDB-从0到1-MVCC

在这里插入图片描述
TiDB从0到1系列

  • TiDB-从0到1-体系结构
  • TiDB-从0到1-分布式存储
  • TiDB-从0到1-分布式事务
  • TiDB-从0到1-MVCC

一、MVCC

Multi-Version Concurrency Control 多版本并发控制,其主要解决了读并发的问题。
其维持一个数据的多个版本使读写操作没有冲突。也就是说数据元素X上的每一个写操作产生X的一个新版本,为X的每一个读操作选择一个版本。由于消除了数据库中数据元素读和写操作的冲突,从而具有更好的性能。特别是对于数据库读和写两种方法,他们不用等待其他同时进行的相同数据写和读的完成。在并发事务中,数据库写只等待正在对同一行数据进行更新的写,这是现有的行级锁的弱点。同时MVCC回收不需要的和长时间不用的内存,防止内存空间的浪费。

在传统关系型数据库中,MVCC的实现方式通常还与事务的隔离级别有关。如MySQL中

  • RC隔离级别下,事务中可以立即读取到其他事务commit过的readview数据(通过redo产生最新的read view)
  • RR级别下,事务中从第一次查询开始,生成一个一致性readview,直到事务结束(通过undo历史链表)

二、TiDB中的MVCC

通过判断列簇中是否有主锁决定是否要读历史版本数据。

1、场景

假设test表中现在有三行数据

id:1,name:Tom
id:2,name:Andy
id:4,name:Tony

事务一:

Begin(start_ts=100)
update test set name='Jack' where id=1;
update test set name='Candy' where id=2;
Commit;(commit_ts=110)

事务二:

Begin(start_ts=115)
update test set name='Tim' where id=1;
update test set name='Jerry' where id=4;
未执行Commit;

此时TSO来到120,并分别读取test表中id=1、2、4的数据,TiDB内部是如何处理的呢?

2、数据存储逻辑

首先来看下目前TiKV中数据、锁是什么样了
在这里插入图片描述

可以看到,在默认列簇中存储的是最新的Commit过的数据。
而写列簇中记录了这些数据的start_ts和commit_ts以及主键信息。
在锁列簇中记录了所有(当前、之前)的锁信息。

3、读取数据(id=1)

读取id=1的数据行 (从又向左,依次读取写列簇、锁列簇、默认列簇)
首先在写列簇中找到id=1的最新一条数据,这里主要目的是拿到id=1数据最后一次操作的两个TSO (可能id=1的有很多,之前说过,TiDB中数据的更新都是以插入的形式存在)
接着去锁列簇中看是否有id=1的相关锁信息:发现确实有一条,在start_ts=115时加的主锁,但是没有锁释放的数据,说明start_ts=115的事务还没有提交。这里也符合我们设立的场景(事务二未提交)。
当找到start_ts=115且没有提交锁信息,最后去默认列簇中找到TSO在115以前,id=1的最新数据 (再次强调可能id=1的有很多,因为TiDB中数据的更新都是以插入的形式存在)
最终读取到id=1的数据,name=Jack。
结果符合预期。
在这里插入图片描述

4、读取数据(id=2)

首先在写列簇中找到id=2的最新一条数据的两个TSO;
接着去锁列簇中看是否有id=2的相关锁信息:发现并没有。
所以直接去默认列簇中找到start_ts=100的id=2的数据即可.
最终读取到id=2的数据,name=Candy。
结果符合预期。
在这里插入图片描述

5、读取数据(id=4)

首先在写列簇中找到id=4的最新一条数据;
接着去锁列簇中看是否有id=4的相关锁信息:发现确实有一条,在start_ts=115时加的跟随锁,但是没有锁释放的数据,说明start_ts=115的事务还没有提交。这里也符合我们设立的场景(事务二未提交)。
当找到start_ts=115且没有提交锁信息,最后去默认列簇中找到TSO在115以前,id=4的最新数据
最终读取到id=4的数据,name=Tony。
结果符合预期。
在这里插入图片描述

彩蛋

TiDB以三个逻辑列簇+TSO版本号的方式实现了MVCC可以说非常的巧妙,但是带来的一大问题就是在高并发读写时可能存在历史版本堆积的情况,从而导致读写变慢。这时就需要控制好GC的时间来保证性能。

在这里插入图片描述

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

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

相关文章

虚拟机报错:VMX 进程已提前退出。VMware Workstation 无法连接到虚拟机。

解决报错:VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 VMX 进程已提前退出。 解决方案:右键桌面图标进入VMware Workstation Pro的属性设置,兼容性–勾选“以管理员…

【windows】Total Uninstall:一款功能强大的完全卸载软件

软件介绍 Total Uninstall是一款专业的软件卸载工具,旨在帮助用户彻底地清除计算机上的应用程序,包括与应用程序相关的所有文件和注册表项。以下是Total Uninstall的一些主要功能和特点: 完全卸载:软件可以监视应用程序的安装过程…

【C++题解】1321. 时钟旋转(2)

问题:1321. 时钟旋转(2) 类型:字符串 题目描述: 时钟从时间:xx:xx(xx时xx分),走到时间:xx:xx(xx时xx分),时针共旋转了多…

uniapp一些问题解决

1.按钮边框如何去除? 参考博主:微信小程序按钮去不掉边框_微信小程序button去掉边框-CSDN博客文章浏览阅读1k次。最近在学uni-app,顺便自己写个小程序。左上角放了个button,可边框怎么也去不掉…原来微信小程序的按钮要去掉边框要…

新零售数据中台:打造智能商业运营的核心引擎_光点科技

随着数字化转型的浪潮席卷全球,新零售行业正在经历一场前所未有的革新。在这一过程中,“新零售数据中台”逐渐成为企业构建智能商业运营的核心引擎。本文将重点介绍新零售数据中台的概念、其在新零售中的作用,以及如何通过数据中台实现商业价…

基于YOLOV8/YOLOV5的远距离停车场车位检测识别系统

摘要: 在本文中深入探讨了基于YOLOv8/v7/v6/v5的停车位检测系统, 开发远距离停车位检测系统对于提高停车效率具有关键作用。。本系统核心采用YOLOv8技术,并整合了YOLOv7、YOLOv6、YOLOv5算法,以便进行性能指标对比。深入解释了YOL…

【QT环境配置】节约msvc2017灰色不可用问题

1. 问题 msvc2017不可用,2019、2022都同理解决。 2. 解决 第一步:打开控制面板->程序->程序和功能->找到自己安装的vs程序->鼠标右键后出现卸载更改->点击更改。 找到下面组件即可。(msvc2019就找msvcv142) …

SQL刷题笔记day5

SQL218题目 我的错误代码: select de.dept_no,de.emp_no,s.salary from employees e join dept_emp de on de.emp_no e.emp_no join salaries s on s.emp_no e.emp_no where de.dept_no not in dept_manager.dept_no #not in 好像不能直接这样用 这里报错 正确代…

宝兰德入选“鑫智奖·2024金融数据智能运维创新优秀解决方案”榜单

近日,由金科创新社主办、全球金融专业人士协会支持的“2024 鑫智奖第六届金融数据智能优秀解决方案”评选结果正式公布。凭借卓越的技术实力和方案能力,宝兰德「智能全链路性能监控解决方案」从90个参选方案中脱颖而出,荣誉入选“鑫智奖2024金…

【ArcGISPro】3.1.5下载和安装教程

下载教程 arcgis下载地址:Трекер (rutracker.net) 点击磁力链下载弹出对应的软件进行下载 ArcGISPro3.1新特性 ArcGIS Pro 3.1是ArcGIS Pro的最新版本,它引入了一些新的特性和功能,以提高用户的工作效率和数据分析能力。以下是ArcGIS…

Vue进阶之Vue项目实战(四)

Vue项目实战 出码功能知识介绍渲染器性能调优使用 vue devtools 进行分析使用“渲染”进行分析判断打包构建的产物是否符合预期安装插件使用位置使用过程使用lighthouse分析页面加载情况使用performance分析页面加载情况应用自动化部署与发布CI/CD常见的CI/CD服务出码功能 出码…

香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(二)

前期笔记回顾 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(一) 本章前言 在上一章节:测试笔记(一)中,我们已经掌握并搭建了板卡的初步调试环境。 接下来,我们将逐步上手官方的…

c 的库函数有哪些

C语言的库函数非常丰富,涵盖了多种功能,为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类: 标准输入输出函数: printf():用于输出格式化的数据到标准输出设备。scanf():用于…

抠像标签合并到原图,jpg 和 png合并,查看标签是否准确

抠像 原图 和 标签合并,查看抠像是否准确 合并后的图,是带有 羽化 效果的 import osimport cv2 import numpy as npdef apply_mask_with_feathering(original_image_path, mask_image_path):# 读取原图和mask图original_image cv2.imread(original_im…

[Halcon学习笔记]Halcon窗口进行等比例显示图像

目录 需求分析Halcon显示原理显示实现具体实现Halcon代码 需求分析 在使用Halcon加载图像时,点击Halcon的适应窗口,图像都会按照窗口大小对图像进行拉伸后显示,实际项目中,需要等比例显示图像,体现图像原本的尺寸细节…

抖音和快手哪个好?来全面了解一下他们的区别!

快手和抖音虽然是短视频领域的两大主流平台,但是两者也存在本质的区别,从产品定位、用户群体到视频风格、变现模式,它们的特征都不一样。 (一)两个平台核心区别: 1. 核心用户不一样:抖音以1、…

dubbo复习:(7)使用sentinel对dubbo服务进行限流

一、下载sentinel-dashboard 并启动 java -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar二、在spring boot应用中增加sentinel相关依赖 <dependency><groupId>com.alibaba.csp…

护网在即,请拿你走你的蓝队神器!~

前言 养兵千日用兵一时&#xff0c;护网已经临近了&#xff0c;你是不是还在考虑现场一系列可能发生的情况&#xff1f;提前找好工具,避免在甲方面前太尴尬? 你需要它&#xff01; 据我了解&#xff0c;去年国护的时候就已经有不少攻城狮在使用我们的蓝队应急响应工具箱&am…

【易错题】数据可视化基础练习题(30道选择题)#CDA Level 1

本文整理了数据可视化基础知识相关的练习题&#xff0c;共30道&#xff0c;适用于想巩固数据可视化知识的同学&#xff0c;也可作为备考CDA一级的补充习题。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-可视化&#xff09;。 1&#xff09; 2&#xff09; 3&…

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装&#xff0c;如果是家庭版&#xff0c;则需要执行如下步骤。 注&am…