当前位置: 首页 > article >正文

【TiDB理论知识04】TiKV-分布式事务与MVCC

分布式事务

下面一个事务 里面有两个更新,分别将id=1的Tom改为Jack,将id=2的zhangsan 改为 lisi。在MySQL中这个事务很普通,但是在分布式数据库TiDB 中的会遇到什么问题呢?

begin;
(1,'Tom') --> (1,'Jack')
(2,'zhangsan') --> (2,'lisi')
commit;

比如(1,‘Tom’)  存储在一个TiKV中 ,(2,'zhangsan')存储在另一个TiKV中,

当我完成修改操作(1,‘Tom’) --> (1,‘Jack’) 数据所在的TiKV并提交后,存储(2,'zhangsan')的TiKV不可用了,这样就出现了一个事务中一部分提交修改持久化,一部分未提交的状况,破坏了事务的原子性。

TiDB采用Google的模型解决这个问题 

分布式事务在TiKV的存储

通过一个只修改一行的事务了解事务是如何存储在TiKV中的 。

事务流程

begin;  从PD中获取事务开始的时间戳 start_ts

接下来会把修改的数据读取到内存中,

commit;两阶段提交 ;第一阶段 prewrite阶段,写两个CF, 分别为default CF  和 Lock CF。将内存中修改的数据写入到TiKV节点中 ,将锁信息写入到TiKV节点中。第二阶段 commit阶段,从PD中获取事务结束的时间戳commit_ts。

乐观锁:在提交commit的时候将锁信息写入到TiKV ,其他会话感知不到

悲观锁:将锁信息提前写入到TiKV中,其他会话可以感知到。

目前讨论的按乐观锁讨论

事务是如何存储在TiKV上 

事务中,TiKV节点会有三个CF 分别存储为

default  CF 存储修改的数据,put  <3_100,Frank > 在 (ID_时间戳,修改的新值),只存储修改的新值,因为新数据永远在上面

put  <3_100,Frank > 修改

put  <3_100,Frank > 插入

delete  <3_100,Frank > 删除

Lock CF 存储锁信息 ,只给事务修改的第一行加一把主锁 ,其他修改的行指向主锁。

锁结构<3,(w,pk,3,100,...)>  w代表写锁,pk代表主键,3 代表key? ,100代表开始时间戳

在Write CF中 写入 提交信息 ,commit 之后 两阶段提交的第二阶段,

<3_110,100>  <业务ID_提交时间,事务开始时间>

然后写入 锁信息的清理,不是删除 LOCK CF中数据,而是插入一条数据 例如

<3,(D,pk,3,100,...)>  D 代表删除

write CF 不单单会记录提交信息 ,当这一行的数据长度小于255字节时 ,还能写数据的修改。

分布式事务在TiKV的实现

分布式事务解决的关键点:只给修改的第一行加一把主锁 ,其他行加的是锁的指向 ,指向第主锁 。分布式事务原子性,取决于主锁。

put <1_100,Jack> 业务id_事物开始的时间戳 ,

<1,(W,pk,1,100...)> 只给修改的第一行加一把主锁 ,其他行加的是锁的指向 ,指向第主锁 

put<2_100,Candy>

<2,(w,@1,2,100...)> 存储的是锁的指向,指向的是主锁。

MVCC

如果需要修改很多数据,这些数据在修改期间都不能读写,那严重影响了数据库系统的并发性。

解决上面的方法 :写确实不能再写了,因为这些数据在修改。但是可以读。

其他数据库也有MVCC。


http://www.kler.cn/news/162479.html

相关文章:

  • Ubuntu 20.04安装禅道开源版
  • Python源码30:海龟画图turtle画紫色的小熊
  • 一文搞懂什么是Hadoop
  • AGI智能新时代,大模型为软件开发带来范式变革
  • 目标检测——Faster R-CNN算法解读
  • Windows 10安装FFmpeg详细教程
  • yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
  • zabbix(2)
  • 春晚回应吉祥物“龙辰辰”被质疑 AI 合成;周星驰 Web3 团队下月上线独立 App 丨 RTE 开发者日报 Vol.102
  • windows下开机启动nignx、mysql、redis等服务
  • 【Windows下】Eclipse 尝试 Mapreduce 编程
  • 上证指数近十年走势图
  • vue-quill-editor上传图片base64转化为img标签
  • 信息系统开发方法
  • 点滴生活记录1
  • k8s之镜像拉取时使用secret
  • 从浅入深掌握进阶结构体(C语言)
  • Redisson的基础使用(2)
  • 在UBUNTU上使用Qemu和systemd-nspawn搭建RISC-V轻量级用户模式开发环境
  • Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上
  • vim + ctags 跳转, 查看函数定义
  • 微信和支付宝JSAPI支付页面 html
  • 设计模式之结构型模式(适配器、桥接、组合、享元、装饰者、外观、代理)
  • 字节开源的netPoll底层LinkBuffer设计与实现
  • 为什么Java程序员需要掌握多线程?揭秘并发编程的奥秘
  • 前端Excel导出实用方案(完整源码,可直接应用)
  • uniapp 显示文件流图片
  • 2024年强烈推荐mac 读写NTFS工具Tuxera NTFS for Mac2023中文破解版
  • 【FreeRTOS】信号量——简介、常用API函数、注意事项、项目实现
  • 【力扣100】4.移动零