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的时间来保证性能。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解

目录 一、array.flat()方法 1.1、array.flat()的语法及使用 ①语法 ②返回值 ③用途 二、array.flatMap() 方法 2.1、array.flatMap()的语法及作用 ①语法 ②返回值 ③用途 三、array.flat()与a…

Android MediaCodec 简明教程(九):使用 MediaCodec 解码到纹理,使用 OpenGL ES 进行处理,并编码为 MP4 文件

系列文章目录 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查…

接入knife4j-openapi3访问/doc.html页面空白问题

大概率拦截器拦截下来了,我们F12看网络请求进行排查 都是 /webjars/ 路径下的资源被拦截了,只需在拦截器中添加该白名单即可"/webjars/**" 具体配置如下: Configuration public class WebConfig implements WebMvcConfigurer {priv…

百度智能云与博彦科技达成战略合作 共同推动千行百业智能化升级

5月30日,百度智能云与博彦科技签署战略合作协议,双方已经基于以百度智能云千帆大模型平台为核心的产品、解决方案,在市场拓展、集成开发、实施交付、运营运维等领域开展深度合作,未来将进一步共同推动大模型技术创新和行业应用落地…

【MySQL用户管理】

文章目录 1.用户信息2.创建用户3.删除用户4.修改用户密码5.给用户设置权限展示zhangsan用户的权限 6.回收权限 1.用户信息 host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆 user: 用户名 authenticatio…

Git基本配置,使用Gitee(一)

1、设置Giter的user name和email 设置提交用户的信息 git config --global user.name "username" git config --global user.email "Your e-mail"查看配置 git config --list2、生成 SSH 公钥 通过命令 ssh-keygen 生成 SSH Key -t key 类型 -C 注释 ssh-…

鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性

显隐控制 控制组件是否可见。 说明: 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本…

如何为您的独立站获取高质量外链?

获取高质量的外链是提升独立站搜索引擎排名的重要步骤。在这过程中,选择合适的外链服务至关重要。GPB外链,即""Guangsuan Private Backlinks"",是一种被广大外贸从业者认可的高质量外链服务。 GPB外链与其他外链服务的区…

leetCode.86. 分隔链表

leetCode.86. 分隔链表 题目思路&#xff1a; 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…

今日学会的,刘姥姥进大观园

Git - First-Time Git Setup 下载了Git&#xff0c;会用Git了&#xff1f; 还有这个&#xff1a;学习 HTML5 Canvas 这一篇文章就够了 | 菜鸟教程 (runoob.com) JavaScript 用法 | 菜鸟教程 (runoob.com) 看到这个真的是受益匪浅&#xff0c;我终于懂了一直有的疑惑。 3D可…

StrApi基本使用

1.创建项目(这里只使用默认的sqllite) 点击链接进入官网查看先决条件,看看自己的node,python等是否符合版本要求 运行以下命令进行创建项目(网慢导致下载失败的话可以尝试使用手机热点给电脑使用,我就是这样解决的,也可以看我csdn的资源这里进行下载) yarn create strapi-ap…

深度神经网络——什么是线性回归?

线性回归是一种用于预测或可视化的算法 两个不同特征/变量之间的关系。 在线性回归任务中&#xff0c;要检查两种变量&#xff1a; 因变量和自变量。 自变量是独立的变量&#xff0c;不受其他变量的影响。 随着自变量的调整&#xff0c;因变量的水平将会波动。 因变量是正在研究…

【计算机毕设】基于SpringBoot的房产销售系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 随着房地产市场的发展和互联网技术的进步&#xff0c;传统的房产销售模式逐渐向线上转移。设计并实现一个基于Spring Boot的房产销售系统&#xff0…

NFT Insider #132:Solana链上NFT销售总额达到55.49亿美元, The Sandbox成立DAO

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members&#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、…

VMware虚拟机安装Ubutu

打开vmware按步骤安装 选择安装虚拟机路径 选择下载好的镜像 开启虚拟机 等待 回车确认 空格选择/取消 等待等待好按回车 输入用户名&#xff0c;密码就好了

2024就业寒潮下的挑战与机遇:能否守住饭碗,人工智能能否成为新春天?

前言 随着时代的飞速发展&#xff0c;2024年的就业市场迎来了前所未有的挑战。数以百万计的高校毕业生涌入市场&#xff0c;使得就业竞争愈发激烈。然而&#xff0c;在这股就业寒潮中&#xff0c;我们也看到了新的曙光——人工智能的崛起。这一新兴行业以其独特的魅力和巨大的…

12 FreeRTOS 调试与优化

1、调试 1.1 打印 在FreeRTOS工程中使用了microlib&#xff0c;里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数&#xff1a; int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施&#xff0c;它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍&#xff1a; 主要组成部分 传感器&#xff1a;安装于需要监测的位置&#xff0c;用于…

【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码

打造属于你的精彩短视频平台 一、引言&#xff1a;为何选择短剧系统小程序&#xff1f; 在当今数字化时代&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分。而短剧系统小程序源码&#xff0c;作为构建短视频平台的强大工具&#xff0c;为广大开发者提供了快速搭建…

html+css web前端 多边形

<!DOCTYPE html><html><head><meta charset"UTF-8"><title>多边形</title><style type"text/css">#pentagon_6_1 {position: absolute;top: 0px;height: 0; width: 100; border-left: 100px solid rgb(255, 255…