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

ops/2024/10/11 13:30:32/

在这里插入图片描述
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.ppmy.cn/ops/47268.html

相关文章

路由策略简介

一、路由策略 1、定义: 路由策略(RoutingPolicy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路经。 2、目的 设备在发布、接收和引入路由信息时,根据实际组网需要实施一些策…

大一C语言课设 服装销售系统 代码实现与项目总结

问题分析 服装信息管理及销售管理系统。方便对库存服装的信息管理和添加新服装数据,同时兼具库存数量管理功能。 功能实现 1、建立服装信息库,包括:服装代码、型号、规格、面料、颜色、单价、数量; 2、建立销售信息库&#xff…

网页实现输入固定前缀,以及打开数量打开固定数量的网页

网页实现输入固定前缀,以及打开数量打开固定数量的网页 废话不多说直接上代码 今天客户说要写一个小需求: 我这边需求是帮我编写一个小程序或者是批处理文件,实现尾数连续的链接打开 例如http://abc1.com,后续依次自动打http://abc2.com,http…

Android Bundle的作用

Android Bundle的作用 Bundle作用 Bundle作用 Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数…

LeeCode 1787 DP

题意 传送门 LeeCode 1787 使所有区间的异或结果为零 题解 任一个元素都至多对 k k k个长度为 k k k的区间产生影响,故难以直接依次处理每一个元素。 观察到满足条件的数组中模 k k k意义下索引相等的各个元素相同,故可以依次处理每一个同余类。 d p…

【TB作品】MSP430G2553单片机读取DS18B20温度传感器,OLED显示

功能 MSP430G2553单片机读取DS18B20 0.96寸 IIC 四针OLED 部分程序 uint temp_value 0; /* 温度 */ int main(void) {unsigned char xianshi[10];WDTCTL WDTPW WDTHOLD; /* Stop WDT */OLED_Init(); /* OLED初始化 *///显示汉字 温度:摄氏度OLED_ShowCHinese(…

AVL树的介绍与实现

前言 我们上一期介绍了二叉搜索树并做了实现,本期我们来继续学习另一个更优的树即AVL树! 本期内容介绍 什么是AVL树? AVL树的实现 AVL树的性能分析 在正式的介绍AVL树之前,我们先来回忆一下二叉搜索树的特点:左子树的…

Python登录漏洞复现

Python登录漏洞复现 3.1 环境准备 1)升级pip pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple2)安装ddddocr图形识别库 pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple3)安装requests网络请求…