TiDB的分布式事务原理探究
事务开启
获取全局授时作为startTS构建一个tikvTxn对象(包括snapshot)。
事务写
txn.Set方法本质上将kv值写入了一个内存缓存(即kv/memdb_buffer.go中的memDbBuffer)中。该内存kv数据库利用的是golevel提供的功能。
事务回滚
直接将tikvTxn的valid字段置为false,之后如果用户再执行提交或者回滚操作,会检查valid,如果为false则直接返回错误。
事务提交
操作映射
遍历kv数据库中所有的key,并将每个key和其操作组装到一起成为一个mutationEx对象,并且将其放到一个map中(map由key映射到mutationEx),最后将这个map放入twoPhaseCommitter的mutations字段。
操作也是通过key的内容推断出来的,推断逻辑如下:
- key的长度为0,则操作为删除(Op_Del)
- 如果key的长度大于0,且不需要延迟检查或者延迟检查不通过(value的当前长度大于0),则操作为Op_Put(即新增key或者更新key)
- 如果key的长度大于0,且延迟检查(value的当前长度等于0)通过,则操作为Op_Insert(即新增key,不允许更新key)
- 对于tikvTxn中的lockKeys字段中的key,如果他在kv数据库中不存在的话,则给予Op_Lock(即单纯的作为锁,事务结束就将这个key删除)
Prewrite
Percolator事务模型有primary和secondaries的概念,TiDB的实现中直接将第一个key作为Primary,剩下的Key全部作为secondaries
TiDB上的操作:
- 将所有的key按照Region进行分组(从Region缓存或者PD中获取key所处的Region)
- 将每组的key再拆分成Batch(每个Batch在16k作为,主要目的是为了缩小RPC packet的大小),并发地对每个batch进行处理(即给TiKV发送Prewrite指令)
注意:其实在Prewrite阶段的实现并不太能看出primary和secondaries的区别,他们都被一起打成batch并发处理了。
Tikv接收到指令之后对每个Batch分别进行Prewrite:
遍历batch中每个元素的mutationEx(之前操作映射时组装的),然后分别进行如下操作:
- 如果操作是Op_Insert的话,则以事务开始时间startTs进行快照读检查key是否重复,如果重复则标记错误,看batch中下一个元素
- 编码出一把锁(所谓“锁”就是指key的version为全0的64位bit,正常情况下是时间戳,所以锁永远排在第一个)
- 检查是否有其他事务给该key上锁(即查看是否有version为全0的key),如果有则事务冲突
- 上面的检查通过了的话,则查看Rocksdb上紧接着锁的下一个key(即最新的key),查看其时间戳是否大于等于startTs,如果这样的话,说明有其他事务先提交了,事务冲突。
- 上面的检查也通过了的话则将自己的锁("锁"的信息包括startTs,primary,value以及操作码等等,详见store/mockstore/mocktikv/mvcc.go中的mvccLock结构)插入进去
Commit
TiDB中的逻辑:
- 重新获得一个全局授时作为提交时间戳commitTs
- Region分组,Batch拆分和上面是一样的
- 先提交Primary
- 然后在后台提交secondaries
TiKV中的逻辑:
新建一个Rocksdb的Batch进行批量的增删,然后对于每个key
- 除了Op_Lock操作的Key,都以CommitTS作为Key的版本号插入进去,组装Value的时候将TiKV的操作码转成底层mvcc store的操作码(将Op_put转成typePut,剩下的除了不可能出现的Op_Lock,都转换成typeDelete),然后删除锁
- 对于Op_Lock操作的Key则直接删除锁即可
End
作者:元青
微信公众号 「技乐书香」
相关文章:
TiDB的分布式事务原理探究
事务开启 获取全局授时作为startTS构建一个tikvTxn对象(包括snapshot)。 事务写 txn.Set方法本质上将kv值写入了一个内存缓存(即kv/memdb_buffer.go中的memDbBuffer)中。该内存kv数据库利用的是golevel提供的功能。 事务回滚 直接将tikvTxn的valid字段…...
【C语言】函数指针和指针函数
文章目录[TOC](文章目录)前言概述函数指针定义:使用:回调函数指针函数前言 今天学一下函数指针 提示:以下是本篇文章正文内容,下面案例可供参考 概述 函数指针:是一个指向函数的指针,在内存空间中存放的…...
Nodejs中npx简介和作用
一、npx简介npm从5.25.2版开始,增加了 npx 命令。方便了我在项目中使用全局包。二、安装Node安装后自带npm模块,可以直接使用npx命令。如果不能使用用,就要手动安装一下。npm install -g npx三、使用npx想要解决的主要问题,就是调…...
Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解
3D图片更生动,或许在时间序列数据的展示上更胜一筹 想法: 学习3D绘图的想法来自科研绘图中。我从事的专业是古植物学,也就是和植物化石打交道。化石有三大信息:1.物种信息,也就是它的分类学价值;2.时间信息…...
学习ifconfig实战技巧,成为网络管理高手
文章目录前言一. ifconfig 命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示网络设备信息3.2 启动和关闭指定的网卡3.3 对指定的网卡设备执行修改IP地址操作3.4 启动和关闭ARP协议3.5 使用ifconfig添加网卡总结前言 大家好,又见面了,我是沐风晓月&a…...
day38|70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数
70. 爬楼梯(进阶) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2…...
SpringBoot全局异常处理
一、目的 当客户端/前端向服务端发送一个请求后,这个请求并不是每次都能完全正确的处理,比如出现一些资源不存在、参数错误或者内部错误等信息的时候,就需要将异常反馈给客户端或者前端。那么这就需要程序有完整的异常处理机制。 在 Java 中所…...
SpringBoot异常处理
目录 一、 错误处理 1. 默认规则 2. 定制错误处理逻辑 二、自定义异常处理 1. 实现 ErrorController 2. RestControllerAdvice/ControllerAdvice ExceptionHandler 实现自定义异常 3. 新建 UserController.class 测试 3 种不同异常的处理 4. 最终效果如下 补充 1. 参…...
《C++ Primer Plus》(第6版)第8章编程练习
《C Primer Plus》(第6版)第8章编程练习《C Primer Plus》(第6版)第8章编程练习1. 打印字符串2. CandyBar3. 将string对象的内容转换为大写4. 设置并打印字符串5. max5()6. maxn()7. SumArray()《C Primer Plus》(第6版…...
RAD Studio 11.3 Alexandria Crack
RAD Studio 11.3 Alexandria Crack 瞄准最新平台版本-此版本增加了对Android 13和Apple macOS Ventura的官方支持。它还支持Ubuntu 22 LTS和Microsoft Windows Server 2022。 使用生物特征认证-New为FireMonkey移动应用程序提供了新的移动生物特征认证组件。 部署嵌入式InterBa…...
Stm32 iic 协议使用
/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */ HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF…...
Malware Dev 02 - Windows SDDL 后门利用之 SCManager
写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我拥有 OSCP,OSEP,OSWE,OSED&…...
每日一题29——山峰数组的顶部
符合下列属性的数组 arr 称为 山峰数组(山脉数组) : arr.length > 3 存在 i(0 < i < arr.length - 1)使得: arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i1] > ... &g…...
Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具
文章目录1、前言2、lsof介绍2.1、问题来了: 所有用户都可以采用该命令吗?3、 服务器安装lsof3.1、安装3.2、检查安装是否正常。4、lsof 命令4.1、常用功能选项4.2、输出内容4.2.1 、FD和 TYPE列5、 lsof 命令实操常见用法6 、常用组合命令7、 结语1、前言…...
第十三节 继承
什么是继承? java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立父子关系。 public class Student extends People{} student为子类(派生类),people为父类(基类或者超类…...
【优化】性能优化Springboot 项目配置内置Tomcat使用Http11AprProtocol(AIO)
Springboot 项目配置内置tomcat使用Http11AprProtocol(AIO) Windows版本 1.下载Springboot对应版本tomcat包 下载地址 Apache Tomcat - Apache Tomcat 9 Software Downloads 找到bin目录下 tcnative-1.dll 文件 2 放到jdk的bin目录下 Linux版本 在Springboot中内嵌的Tomcat默…...
SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties
ConfigurationProperties 这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性 为yml某个类注入 只要将对应的yml类对象声明实体pojo并交给spring容器管理,再在类上使用ConfigurationProperties绑定对应的类名即可 涉及到两个知识点,这个类对…...
数组一次性删除多条数据
需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮,点击时将当前行的索引传递给方法,splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…...
相机删除照片如何恢复?一键解决它
相机删除照片如何恢复?喜欢用相机拍照的人,总会在空闲时多拍几张,这使我们相机中会储存大量的、各种各样的照片。等到回家后,在进行删除,并选出比较好的照片。但也很容易就误删了一些好看的照片。碰到这种意外事&#…...
vue3搭建教程(基于webpack+create-vue+ element-plus)
前言使用vue脚手架搭建vuetswebpack项目搭建步骤:下载node 版本可以 12 或者14或者 16.0,此次使用的>16.0版本,vue-cli通过npm i -g vue/cli 升级到了 vue cli v5.0.8建目录,如(vue3Study)用IDE工具打开…...
代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II,494. 目标和,474.一和零
代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II,494. 目标和,474.一和零1049. 最后一块石头的重量 II494. 目标和474.一和零1049. 最后一块石头的重量 II 题目: 有一堆石头,每块石头的重量都是正整数。…...
Java8中Lambda表达式之Collection 的常见用法
背景 在java8中引入了Lambda表达式。其实,他就是一个匿名函数。我们经常会用到一些循环遍历,起始完全就可以通过Lambda来简化我们不必要的操作,下面我们来看一下Lambda常用的方法。 准备条件 DataBuilderprivate static class Person {priv…...
SpringCloud系列知识快速复习 -- part 2(Sentinel微服务保护,Seata分布式事务,Redis分布式缓存和多级缓存)
SpringCloud系列知识快速复习 -- part 2(Sentinel微服务保护,Seata分布式事务,Redis分布式缓存和多级缓存Sentinel微服务保护什么是雪崩问题?解决方法服务保护技术对比流量控制簇点链路Sentinel流控模式流控效果热点参数限流隔离和…...
设置CentOS7的时间与网络同步
1.设置时区为北京时间 [rootlocalhost ~]# timedatectl set-timezone Asia/Shanghai 2.查看系统时间 [rootlocalhost ~]# timedatectl Local time: 四 2023-03-02 17:40:41 CST #系统时间 Universal time: 四 2023-03-02 09:40:41 UTC …...
java开发手册之编程规约
文章目录编程规约命名风格常量定义代码格式OOP规约集合处理并发处理控制语句注释规约其它编程规约 命名风格 1.代码中的命名均不能以下划线或者美元符号开始,也不能以下划线或者美元符号结束 例如:_name | name__ | name$ | $name2.代码中的命名严…...
Camera | 5.Linux v4l2架构(基于rk3568)
上一篇我们讲解了如何编写基于V4L2的应用程序编写,本文主要讲解内核中V4L2架构,以及一些最重要的结构体、注册函数。 厂家在实现自己的摄像头控制器驱动时,总体上都遵循这个架构来实现,但是不同厂家、不同型号的SoC,具…...
机房PDU如何挑选?
PDU PDU(Power Distribution Unit,电源分配单元),也就是我们常说的机柜用电源分配插座,PDU是为机柜式安装的电气设备提供电力分配而设计的产品,拥有不同的功能、安装方式和不同插位组合的多种系列规格,能为不同的电源环境提供适合的机架式电源分配解决方案。PDU的应用,…...
lab备考第二步:HCIE-Cloud-Compute-第一题:FusionCompute
第一题 FusionCompute 一、题目介绍 1.1. 扩容CAN节点与对接共享存储(必选) 题目及【考生提醒关键点】 扩容一台CNA节点,配置管理地址设置为:192.168.100.212。密码设置为:Cloud12#$。【输入之前确认自己的大小写是否…...
js-cookie和vue-cookies(Cookie使用教程)
简述:js-cookie和vue-cookies都是vue项目中的插件,下载相关依赖后,可以用来存储、获取、删除Cookie等操作,思路相同,操作时稍有不同,当然也可以用原生js来获取Cookie; ⭐ js-coo…...
开创高质量发展新局面,优炫数据库助推数字中国建设
最新印发《数字中国建设整体布局规划》,建设数字中国是数字时代推进中国式现代化的重要引擎,是构筑国家竞争新优势的有力支撑。 数字中国建设按照“2522”的整体框架进行布局,即夯实数字基础设施和数据资源体系“两大基础”,推进…...
新乡手机网站建设哪家专业/google搜索引擎下载
也许没有相当于RDB的条件只存在于条件中.我怎样才能实现不存在或者存在等效于不存在?解决方法:这里是一个PHP实现public function getRecordsByInExpression($tableName, $providerCode, $fieldName, $values, $logicalOp self::IN_EXP){$queryExp [TableName >…...
建设网站第一步/怎样精准搜索关键词
VSCode Change Default Terminal 如何修改vscode的默认terminal??? VSCode Change Default Terminal 如何修改vscode的默认terminal??? ...
深圳网站设计知名乐云seo/抖音搜索优化
Spring 容器核心可归纳为两个类: BeanFactory 和 ApplicationContext,ApplicationContext 继承自 BeanFactory ,其不仅包含 BeanFactory 所有功能,还扩展了容器功能。ApplicationContext 核心其实是 refresh 方法,容器…...
城乡建设委员会网站/站长工具seo词语排名
广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者…...
江苏建设厅官方网站/网站搭建详细教程
大家好,我是llP。作为一个码农,日常的开发和学习的过程中,经常需要用到大量的Linux机器,但是我们不可能去找大量(土豪跳过)的物理机来供我们学习,因此使用虚拟机进行开发及学习是我们常用的一种方式;下面就…...
文化传媒公司简介模板/东莞seo项目优化方法
arm64大约支持280个系统调用,我们平时使用的这些系统调用,到底工作原理是什么,调用后又是到哪里实现的呢,这篇文章初步了解下内核系统调用的流程,并告诉跟踪这个流程的方法。废话不多说,如上就是linux的系统…...