051、事务设计之TiDB事务实现方式

news2024/11/29 21:44:41

事务在TiDB中的存储

在这里插入图片描述

分布式事务

在这里插入图片描述
提交的第一阶段,会用三个CF 来存放这些数据信息,
一类列簇对应一类键值对, 第一个CF(default)存放的是数据 的键值对。第二个存放的是锁信息。 第三个对应的是提交信息。

put<3_100,Frank> 3_100: primary_tso 表示是在事务时间戳100的时候对3这个主键进行修改。 注意增删改的操作,里面放的都是新数据。

< 3,(W,pk,3,100 …)> : 写锁,主键,事务相关信息. 注意一点,在TiDB当中,一个事务只有一个主锁,也就是分布式事务中的第一行加锁,这个锁就是主锁pk

put<3_110,100> : 会用第三个CF来存储提交信息,包含主行的标识,开始和提交的时间戳。

< 3,(D,PK,3,100 …)> < 3,(W,pk,3,100 …)> : 提交后,需要清理CF当中索的信息,它不是直接在里面删除这一行,而是新增一行, 告诉主键3上已经删除了锁(D)

读取的时候:它会先到write 的CF中查看 最近一次修改是什么时候,本例是110,并且通过110找到对应的事务开始是100,继而就能找到Frank
如果通过write中找不到,则表示这个记录正在被上锁,处于修改中,则这个记录不能直接读取。

  • Write列: 当用户写入了一行数据时,如果该行数据长度小于255个字节,否则该行的数据会被存入到default列中。当然它更要用于存储 提价的信息
  • default列: 用于存储超过255字节长度的数据。
    在这里插入图片描述

在这里插入图片描述
< 1,(W,PK,1,100 …)>: 注意一点,在TiDB当中,一个事务只有一个主锁,也就是分布式事务中的第一行加锁,这个锁就是主锁pk

< 2,(W,@1,2,100 …)> :这是第二行,就不是主锁,@1 表示 我不是主,我的主锁在1那里。存的是锁的指向。

另外需要理解的是: 当插入修改值的时候,只需要在CF中插入新值即可。例如将Tom改成Jack,当别人去读取的时候,已经变成了Jack,就不用读Tom。

分布式事务如何解决原子性。

例如: 当前有个事务 里面的更新Tom为Jack是在node 1;更新Andy为Candy是在node 2 。 此时在第二阶段提交的时候 node 1成功,node 2失败。 因为节点1已经提交,相当于已经落盘持久化,但节点2此时由于故障 Lock并没有删除索引的信息,write中也没有提交信息。

在这里插入图片描述
此时,就可以通过主锁的机制来补齐相应的信息,流程如下: @1 可以找到对应的node 1,然后通过node 1 上的lock cf可以看到事务已经提交。此时在node 2 上,将write cf中补上<2_110,100> 在lock cf中添加清理索引的信息。这样就保障了分布式事务的原子性

在这里插入图片描述

MVCC

很多数据库都会实现多版本并发控制 (MVCC),TiKV 也不例外。设想这样的场景:
两个客户端同时去修改⼀个 Key 的 Value,如果没有数据的多版本控制,就需要对数据上锁,在分布式场景下,可能会带来性能以及死锁问题。

在这里插入图片描述
这个版本号,可以使用TSO来控制生成(可以简单理解为时间戳)

TiKV 的 MVCC 实现是通过在 Key 后⾯添加版本号来实现,简单来说,没有 MVCC 之
前,可以把 TiKV 看做这样的:

Key1 -> Value
Key2 -> Value
……
KeyN -> Value

有了 MVCC 之后,TiKV 的 Key 排列是这样的:

Key1_Version3 -> Value
Key1_Version2 -> Value
Key1_Version1 -> Value
……
Key2_Version4 -> Value
Key2_Version3 -> Value
Key2_Version2 -> Value
Key2_Version1 -> Value
……
KeyN_Version2 -> Value
KeyN_Version1 -> Value
……

注意,对于同⼀个 Key 的多个版本,版本号较⼤的会被放在前⾯,版本号⼩的会被
放在后⾯(Key 是有序的排列),这样当⽤户通过⼀个 Key + Version 来获取 Value
的时候,可以通过 Key 和 Version 构造出 MVCC 的 Key,也就是 Key_Version。然后
可以直接通过 RocksDB 的 SeekPrefix(Key_Version) API,定位到第⼀个⼤于等于这个
Key_Version 的位置。

在这里插入图片描述

mvcc:就是快照读的意思,因为修改未提交的数据不能直接读取,此时需要通过快照。在TiDB当中不论增删改,它都是追加新值的方式(put)。所以TiKV很便捷的实现MVCC。

在这里插入图片描述

在这里插入图片描述

id = 1 如何读取,首先在write当中到对最近一次提交的TSO,110的时间戳,然后看到对应的是1 100 put < 1_100,Jack)> ,这样就把Jack读出来。读的就是以前值。

如果是写入, 则还需要看上面锁的信息,发现上面有个锁,并且没有释放索引的记录,则表示虽然id =1 在110的时候已经提交,但在115的时候又被写入了,则我当前不能够对这条记录进行写,它当前被这个 lock cf中的记录阻塞了。

在这里插入图片描述

id = 2的时候,读跟id = 1一样。
写可以看到lock当中没有,或者说已经释放。则我这个id =2 的记录可以写。
在这里插入图片描述

读跟以前原理一样
写: 这个时候可以看到 除了在Default中找到对应记录,还需要再Lock中查找,可以看到< 4,(W,@1,115 …)> 有记录,并且没有删除锁的记录,则继续找对应的主锁@1,再分析 < 1,(W,pk,115 …)> 发现它并没有提交,则表明当前这个分布式事务并没有提交,所以会被阻塞。

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

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

相关文章

LeetCode·每日一题·1851. 包含每个查询的最小区间·优先队列(小顶堆)

题目 示例 思路 离线查询&#xff1a; 输入的结果数组queries[]是无序的。如果我们按照输入的queries[]本身的顺序逐个查看&#xff0c;时间复杂度会比较高。 于是&#xff0c;我们将queries[]数组按照数值大小&#xff0c;由小到大逐个查询&#xff0c;这种方法称之为离线查询…

Go语言之接口(interface)

1.1 、多态的含义 在java里&#xff0c;多态是同一个行为具有不同表现形式或形态的能力&#xff0c;即对象多种表现形式的体现&#xff0c;就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定&#xff0c;而是在程序运行期间才确定&am…

T5模型: Transfer Text-to-Text Transformer(谷歌)

&#x1f525; T5由谷歌发表于2019&#xff0c;《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》&#xff0c;最终版本发布在&#xff1a;JMLR。 一句话总结T5: 大一统模型&#xff0c;seq2seq形式完成各类nlp任务&#xff0c;大数据集…

Docker 的前世今生:从社区到市场,从领域到技术应用的全方位分析

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

下载编译Chromium

参考&#xff1a;Mac上本地编译Chrome浏览器踩坑笔记&#xff08;2021.02最新&#xff09; - 掘金 For Mac: 一、下载编译工具链&#xff1a;deptool git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH"$PATH:/Users/yumlu/co…

jib进行本地打包,并上传本地镜像仓库

使用 Jib 进行本地打包和上传到本地镜像仓库是一种方便的方式&#xff0c;而无需编写 Dockerfile。Jib 是一个开源的 Java 容器镜像构建工具&#xff0c;它可以直接将 Java 项目打包为镜像&#xff0c;并将其推送到容器镜像仓库。 gradle 进行jib的配置 import java.time.Zon…

第53步 深度学习图像识别:Bottleneck Transformer建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Bottleneck Transformer "Bottleneck Transformer"&#xff08;简称 "BotNet"&#xff09;是一种深度学习模型&#xff0c;在2021年由Google的研究人员在论文"Bottleneck Transfor…

MaxCompute与 Mysql 之单字段转多行

在实际数据处理中&#xff0c;可能会遇到行列转换的数据处理&#xff0c;在 MaxCompute 与 AnalyticDB MySQL 数据处理与转换 介绍过如多行转一行&#xff0c;本篇主要介绍将逗号分割的字段转成多行。 一、MaxCompute 实现方式 在MaxCompute中有TRANS_ARRAY函数&#xff0c;可…

显示一行或两行多出的文字用省略号代替

以上就是一行的效果&#xff0c;超出宽度就用...代替 .recommendContainer .scrollItem text{/* 单行文本溢出隐藏 省略号代替 */display: block;white-space: nowrap; /*溢出不换行*/overflow: hidden; /*溢出隐藏*/text-overflow: ellipsis; /*溢出的内容已...代替*/} 多…

watch中监听vuex中state改变监听不到

watch中监听vuex中state改变监听不到 https://blog.csdn.net/aliven1/article/details/100581529?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-100581529-blog-122614448.t5_layer_targeting_sa&spm1001.2101.3001.4242…

软通动力与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于软通动力的产品及解…

从Vue2到Vue3【二】——Composition API(第二章)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介及创建从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09; 文章目录 系列文章目录前言一、 生命周期二、hook三、toRef以及toRefs总结 前言 Vue3作为Vue.js框架的最新版本&#xff0c;引入了许多令人激动的新…

vue项目部署自动检测更新

前言 当我们重新部署前端项目的时候&#xff0c;如果用户一直停留在页面上并未刷新使用&#xff0c;会存在功能使用差异性的问题&#xff0c;因此&#xff0c;当前端部署项目后&#xff0c;需要提醒用户有去重新加载页面。 在以往解决方案中&#xff0c;不少人会使用websocke…

C#基础--委托

C#基础–委托 C#基础–委托 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名) 一、什么是委托,委托的本质是什么? 跟方法有点类似,有参数,返回值,访问修饰符+ delegate public delegate void …

Python 算法基础篇:哈希表与散列函数

Python 算法基础篇&#xff1a;哈希表与散列函数 引用 1. 哈希表的概念2. 散列函数的概念 a ) 一致性 b ) 均匀性 c ) 高效性 3. 散列函数的实现4. 哈希表的实现5. 哈希表的冲突解决 a ) 链地址法 b ) 开放地址法 6. 实例演示实例&#xff1a;电话簿 总结 引用 哈希表是一种高…

[计算机入门] 文件夹(目录)及路径

2.7 文件夹(目录)及路径 文件夹&#xff08;folder、目录&#xff09;是一种用于存储和组织文件和其他文件夹的容器。它可以包含任意数量的文件和子文件夹&#xff0c;并且可以通过拖放、复制和粘贴等操作来移动、复制和管理这些文件和子文件夹。 Windows文件夹可以帮助用户更…

spring复习:(43)使用TransactionProxyFactoryBean来实现事务时,事务是怎么开启的?

一、配置文件&#xff1a; <bean id"myFactoryBean"class"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name"transactionManager" ref"transactionManager" /><property nam…

可以替代微软 Exchange 的 几个开源软件分享给你

微软Exchange是一个功能强大的邮件和群件解决方案&#xff0c;但对于一些用户来说&#xff0c;寻找替代方案可能是必要的。幸运的是&#xff0c;有几个开源软件提供了可靠而且功能丰富的替代选项。这些开源软件不仅可以满足组织和个人的邮件和协作需求&#xff0c;还具有灵活性…

quartus18.0如何下载安装Cyclone V器件库

文章目录 前言一、下载流程二、添加步骤三、总结四、参考资料 前言 在我们使用不同版本的板子的时候&#xff0c;我们需要在quartus下安装不同型号的器件库才能对板子进行选型并进行下一步操作。 一、下载流程 官网下载地址 这里我们点击支持选中下载中心&#xff1a; 选择FPGA…

reggie优化04-Nginx

官方网站下载&#xff1a;http://nginx.org/en/download.html 1、Nginx安装 这里需要在Linux系统下&#xff1a; 安装wget工具&#xff1a;yum install wget&#xff08;或者官网下载直接上传到Linux&#xff09; 安装树形结构tree&#xff1a;yum install tree 2、Nginx命令 …