TiDB-从0到1-分布式事务

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

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

一、事务定义

这属于老生常谈了,无论不管是传统事务还是分布式事务都离不开ACID

  • A:原子性
  • C:一致性
  • I:隔离性
  • D:持久性

二、隔离级别

同样都是老一套东西,主要应对脏读、幻读、不可重复读等问题

  • 读未提交
  • 读已提交
  • 可重复读
  • 可串行化

在TiDB中,实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性:
事务只能看到早于它开始时刻之前提交的其他事务。
在这里插入图片描述
如图,T2是无法访问到T1事务的内容,T3是可以访问T1、T2事务中的内容。

而快照隔离基本是基于Percolator事务模型原理实现的

Percolator 模型

Percolator模型是Google在2010年提出的一种分布式事务处理模型,其设计目标是在大规模分布式系统中实现高效的事务处理。Percolator是一种乐观的事务模型,写写冲突被延迟到事务提交时才会进行检测。可见性与冲突检测依赖于事务的开始时间戳以及提交时间戳。
Percolator模型是一个典型的通过两阶段提交(2PC)进行分布式事务协调的实现。事务的实现主要依靠三个参与者:Percolator客户端、BigTable TabletServer、Timestamp Oracle(TSO)。按照2PC的要求分为两个步骤:PreWrite和Commit。
Percolator模型中,事务执行的过程可以概括为以下几个步骤:

  • Percolator客户端作为事务协调者,负责发起事务请求。 BigTable TabletServer接收并处理事务请求。
  • Timestamp Oracle(TSO)提供时间戳服务,确保事务的顺序性和一致性。
  • 在PreWrite阶段,TSO分配一个时间戳给事务,BigTable TabletServer将事务的写请求记录在本地。
  • 在Commit阶段,TSO根据事务的时间戳和BigTable TabletServer的记录,决定是否提交事务。
  • Percolator模型的一个创新点在于,它依靠对时间戳的使用和BigTable的单行事务,实现了跨行事务。由于某一行数据可以位于不同的BigTable的TabletServer之上,所以该事务也是跨节点的。

这里也再次印证TiDB中为什么事务在开始前和提交时会分别获取一次TSO。

三、TiDB-分布式事务(单行)

1、Begin(开启一个事务)

此时会从PD获取一个TSO,假设为100

2、SQL

update test set name=‘Frank’ where id=3;

3、Commit(提交事务)

此时再次从PD获取一个TSO,假设为110

4、进入2PC阶段
  • prewrite阶段
    在这里插入图片描述
    将数据:3(id)_100(事务开始的TSO),Frank(数据内容)记录在默认链表中
    将锁信息:3(id),W(写锁),pk(主锁),3(id),100(事务开始的TSO),Frank(数据内容)记录在锁链表中
  • commit阶段
    在这里插入图片描述
    将锁信息:3(id),D(已释放的锁),pk(主锁),3(id),100(事务开始的TSO),Frank(数据内容)记录在锁链表中
    将数据:3(id)_110(事务提交的TSO),100(事务开始的TSO)记录在更新链表中

这里有两个细节
1、TiDB中的DML都是以追加的方式实现。
做一个对比
传统关系型数据库:

begin;insert into test(id,name) values(1,'zmz');commit;
begin;update test set name='MySQL' where id=1;commit;
begin:update test set name='TiDB' where id=1;commit;

此时底层其实只有一条数据,就是id:1\name:TiDB

TiDB数据库:

begin;insert into test(id,name) values(1,'zmz');commit;
begin;update test set name='MySQL' where id=1;commit;
begin:update test set name='TiDB' where id=1;commit;

此时底层其实是有三条数据的

id:1\name:TiDB
id:1\name:MySQL
id:1\name:zmz

那么当我们在TiDB查询test表时会查到3条数据吗?当然不会,而是根据提交事务的TSO读取到最新的数据。
那么长期看来是不是会有非常多的冗余无效数据呢?当然也不会,GC模块会定时清理掉历史版本数据。

2、上面提到主锁机制
TiDB的分布式事务中,假设一条事务涉及多行数据,那么将采用主锁机制:只对事务的第一行数据上锁,后面的数据跟随第一行的主锁。

四、TiDB-分布式事务(多行)

1、Begin(开启一个事务)

此时会从PD获取一个TSO,假设为100

2、SQL

update test set name=‘Jack’ where id=1;
update test set name=‘Candy’ where id=2;

3、Commit(提交事务)

此时再次从PD获取一个TSO,假设为110

4、进入2PC阶段
  • prewrite阶段
    在这里插入图片描述
    这里与单行数据事务最大的不同是,第二行数据的加锁信息:
    2(id),W(写锁),@1(跟随主锁1),2(id),100(事务开始的TSO),Candy(数据内容)

  • commit阶段
    在这里插入图片描述
    主锁释放后,跟随锁一起释放。
    再次强调,这里的释放不是删除,而是插入新的锁清理记录。

彩蛋

TiDB可以动态调整事务的隔离级别和锁的实现方式

  • 根据transaction_isoiation设置隔离级别
  • 根据tidb_txn_mode设置乐观锁还是悲观锁

在这里插入图片描述

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

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

相关文章

A 股涨停板实时数据 API 数据接口

A 股涨停板实时数据 API 数据接口 股票 / A股 / 涨停数据,所有A股涨停板实时数据,A 股涨停数据 / 实时数据。 1. 产品功能 支持所有 A 股涨停板实时数据查询;包含 A 股实时交易多项指标数据;毫秒级查询性能;全接口支…

Linux系统编程(五)多线程创建与退出

目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建(1)整型的传入与接收(2)浮点数的传入与接收(3)字符串的传入与接收(4)结构体的传入与接收 2. 线程的退出3. 线程的…

FastGPT私有化部署+OneAPI配置大模型

介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址 https://doc.fastai.site/docs/intro/ 部署 FastGPT提供…

如何实现数据的正确拆分?

我们知道在传统的单块架构中,一个系统中只存在一个独立的服务和数据库实例。 上图中的系统架构实现起来比较简单,但是扩展性和伸缩性都比较差。因此,越来越多的系统开始采用了微服务架构。在微服务架构中,一个系统被拆分成多个服务…

6种经典的网页布局设计,你最喜欢哪个?

信息时代,我们每天都会浏览很多网页,但你有没有想过,让你停留在一个新网页的关键因素有哪些?毫无疑问,网页布局一定是关键因素之一。一个优秀的网页布局不仅可以让网站看起来更美观、更专业,还能够抓住用户…

高效记录收支明细,预设类别账户,智能统计财务脉络,轻松掌握个人财务!

收支明细管理是每位个人或企业都必须面对的财务任务,财务管理已经成为我们生活中不可或缺的一部分。如何高效记录收支明细,预设类别账户,智能统计财务脉络,轻松掌握个人财务?晨曦记账本为您提供了完美的解决方案&#…

Java 面向对象编程(OOP)

面向对象编程(Object-Oriented Programming,OOP)是Java编程语言的核心思想之一。通过OOP,Java提供了一种结构化的编程方式,使代码更易于维护和扩展。 一、类和对象 1. 类的定义 类是对象的蓝图或模板,定…

File name ‘xxxx‘ differs from already included file name ‘xxxx‘ only in casing.

一、报错信息 VSCode报错如下: File name ‘d:/object/oral-data-management/src/components/VisitLogPopup/Info.vue’ differs from already included file name ‘d:/object/oral-data-management/src/components/VisitLogPopup/INfo.vue’ only in casing. The…

【PostgreSQL17新特性之-事务级别超时参数transaction_timeout】

PostgreSQL数据库里有多个和会话相关的参数,PostgreSQL17-beta1版本新增了一个transaction_timeout参数,来限制事务的持续时间。 当前的一些和会话相关的超时参数如下 -----------------------------------------------------------------------------…

第一讲:单片机STC89C52+RA8889驱动控制彩屏(源码公开)

51单片机驱动控制彩屏系列讲座 第一讲:单片机STC89C52RA8889驱动控制彩屏(源码公开) 单片机通过SPI与RA8889进行通信,由于单片机是5V,RA8889是3.3V,故需要进行电平转换,有现成的模组TXS0108E等可以采用。…

linux开放某一个端口具体步骤

场景:当服务器防火墙不能直接关闭,但是客户端必须要访问服务器某一个端口时。 处理:对服务器端进行处理,只将该端口开放出来让客户端访问 本地使用vm安装了一个centos服务器,ip地址是 192.168.200.130。在这里充当服…

Kafka原生API使用Java代码-生产者-异步发送消息回调

文章目录 1、异步发送消息&回调1.1、pom.xml1.2、KafkaProducer1.java 1、异步发送消息&回调 回调就是接收kafka的响应 1.1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&q…

Android Studio无法改变Button背景颜色解决办法

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我来和大家探讨一个在Android开发中常见但可能让初学者感到困惑的问题——如何在Android Studio中改变Button的背景颜色。这个问题看似简单&#xff0c;但实际操作中可能会遇到一些意想不到的挑战。接下来&#xff0c;我将从多个…

Facebook:社交世界的接口

在当今数字时代&#xff0c;社交媒体已经成为了人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头之一&#xff0c;扮演着至关重要的角色。本文将带您深入探索Facebook这张社交世界的画卷&#xff0c;全面了解这个令人着迷的平台。 起源与历程 Facebook的故事始…

AI虚拟试穿革命:I2VEdit技术引领电商视频内容创新

在当今快速迭代的电子商务领域,用户体验与内容创新是企业竞争力的核心要素。随着AI技术的飞速进步,AI虚拟试穿已不再局限于静态图像,而是迈向了动态视频的新纪元。本文将深入解析一项革新性技术——I2VEdit,如何以其独到之处,为电商尤其是服装零售行业带来一场内容创作与产…

JVM学习-字节码指令集(二)

对象的创建与访问指令 创建指令 虽然类实例和数组都是对象&#xff0c;但Java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令创建类实例指令&#xff1a;new 它接收一个操作数&#xff0c;指向常量池的索引&#xff0c;表示要创建的类型&#xff0c;执行完成后&am…

重磅发布,2024精选《制造业商业智能BI最佳实践合集 》

在数字时代&#xff0c;中国制造业正面临着前所未有的深刻变革。 商业环境的复杂性与多变性、全球化竞争的激烈程度、消费需求的快速演变&#xff0c;以及新技术的持续进步等多种因素共同推动着制造企业积极加入数字化转型的潮流。 在这个转型的过程中&#xff0c;转型的速度…

Java设计模式 _行为型模式_备忘录模式

一、备忘录模式 1、备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型模式。通过保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。 2、实现思路 &#xff08;1&#xff09;、定义记录数据的格式规范。 &#xff08;2&#xff09;、编…

pyqt Qtreeview分层控件

pyqt Qtreeview分层控件 介绍效果代码 介绍 QTreeView 是 PyQt中的一个控件&#xff0c;它用于展示分层数据&#xff0c;如目录结构、文件系统等。QTreeView 通常与模型&#xff08;如 QStandardItemModel、QFileSystemModel 或自定义模型&#xff09;一起使用&#xff0c;以管…

WAF几种代理模式详解

WAF简介 WAF的具体作用就是检测web应用中特定的应用&#xff0c;针对web应用的漏洞进行安全防护&#xff0c;阻止如SQL注入&#xff0c;XSS&#xff0c;跨脚本网站攻击等 正向代理 WAF和客户端与网络资源服务器都建立连接&#xff0c;但是WAF 的工作口具有自己的 IP 地址&…