数据库必知必会:tidbtikv分布式事务(代码片段)

author author     2023-02-10     680

关键词:

(数据库必知必会:TiDB(4)TiKV分布式事务)

分布式事务

存在的问题

假设有这样一个事务:

begin:
update person set name = Tom where id = 1;
update person set name = Jack where id = 2;
commit;

由于数据在TiKV中是分布式存储的,那么这两条数据就有可能分布在TiKV的两个实例中,比如:id=1的记录在实例1中,id=2的记录在实例2中。当在事务执行过程中实例1上id=1的记录成功更新,而此时实例2出现故障导致id=2的记录更新失败,那么以上这个简单的事务的原子性就会遭到破坏。

Percolator事务模型

TiDB采用Google Percolator事务模型来解决分布式事务的问题。

事务的过程

假设有这样一个事务:

begin:
update person set name = Frank where id = 3;
commit;

事务开始

在事务开始时,begin时,TiDB会从PD中获取事务开始的时间戳TSO,假设TSO=100。

修改数据

然后TiDB将需要修改的数据读取到内存中,在内存中完成数据的修改。

TiDB在内存中修改数据的时候,不会将锁信息写入TiKV,此时其他会话无法感知锁的存在,是乐观事务。

事务提交

在commit的时候进入两阶段提交。

预写

在第一阶段,TiDB会写三个列族到TiKV中:

  • Default列族:记录带有事务开始时间戳标记(100)的修改后的数据
  • Lock列族:记录锁信息,在第一行数据加写锁(W),这是一把主锁(pk),并且记录下其他相关的信息
  • Write列族:预留用来存放提交信息

此时,其他会话会感知到写锁的存在,其他会话不会进行id=3的数据的读、写操作。

提交

在第二阶段,TiDB会从PD中获取事务提交的时间戳TSO,假设TSO=110。

TiDB在Write列族中写入提交信息,包括事务提交的时间戳(110)和事务开始的时间戳(100),完成后在Lock列族中记录一条锁清理的数据,表示写锁已经被释放。

此时,其他会话可进行id=3的数据的读、写操作。

TiDB如何处理分布式事务

假设有这样一个事务:

begin:
update person set name = Jack where id = 1;
update person set name = Candy where id = 2;
commit;

并且两条数据分布在TiKV中的两个实例上。

TiDB会按照事务的处理过程进行处理。

在预写阶段,在事务中的第一条数据(节点1,id=1)上加主锁(pk),在节点2上记录的是附加锁(@1)表示的是主锁在id=1的那条记录那里。

此时,节点1和节点2上都有写锁,其他会话不能对这些数据进行读、写操作。

在提交阶段,节点1和节点2都写入提交信息和清理写锁。

当节点1提交成功,节点2提交失败,那么节点2上的写锁不会被清除。后续在读取数据的时候,发现有写锁存在,并且是附加锁(@1),此时需要判断事务是否提交,会根据附加锁的指向找到主锁,发现主锁已成功提交,则可判断自己在提交阶段出现了问题。因为主锁是成功提交的,所以附加锁这里只需要补充提交即可,继续写入提交信息,清理附加锁,Default列族中的数据变成最终数据。

MVCC

从前面的过程中知道,事务已预写、未提交的时候,数据不能进行读、写操作,这有一个问题,就是读也会被阻塞。

MVCC的引入是为了解决读操作被阻塞的,因为在修改中的、还未提交的数据,还不确定最后是否提交,那么读取修改前的数据应该是被允许的。

MVCC机制下,读操作按最近一次提交记录读取,无需关心锁信息,写操作需要先检查当前是否已存在其他写锁。

假设有两个事务:

--事务1
begin (start_ts = 100)
update person set name = Jack where id = 1;
update person set name = Candy where id = 2;
commit; (commit_ts = 110)

--事务2
begin (start_ts = 115)
update person set name = Tim where id = 1;
update person set name = Jerry where id = 4;

此时,事务1已成功提交,事务2未提交。

假设在时间戳TSO=120的时候,有会话读取数据:

select * from person where id in (1,2,4);

此时id=1和id=4的记录有锁信息但无提交信息,属于在事务中的数据,如果阻塞读操作,那么此时id=1和id=4的记录都是无法读取的。

引入MVCC后。

读id=1的数据时,从Write列族中发现最近一次提交是TSO=100,读操作可以读取TSO=100的数据。

写id=1的数据时,当前锁是TSO=115,因为TSO=115的锁还未提交,所以写被阻塞。

读id=2的数据时,从Write列族中发现最近一次提交是TSO=100,读操作可以读取TSO=100的数据。

写id=2的数据时,当前无锁,所以可以写。

读id=4的数据时,从Write列族中发现最近一次提交是TSO=80,读操作可以读取TSO=80的数据。

写id=4的数据时,当前锁是TSO=115的附加锁,因为主锁还未提交,所以附加锁也还在事务中,写被阻塞。

hive必知必会(代码片段)

hive: 基于hadoop,数据仓库软件,用作OLAPOLAP:onlineanalyzeprocess 在线分析处理OLTP:onlinetransactionprocess在线事务处理 事务: ACID A:atomic 原子性 C:consistent 一致性 I:isolation 隔离性 D:durability 持久性 1读未提交   脏读 //事务... 查看详情

大厂面试必知必会:图解分布式事务实现原理(代码片段)

问题场景什么是事务?事务是数据库从一个稳定状态变迁到另一个稳定状态的保证,具备ACID这4个特性:原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中... 查看详情

大数据必知必会:hadoop伪分布式安装(代码片段)

(大数据必知必会:Hadoop(2)伪分布式安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情

大数据必知必会:hadoop分布式集群环境安装(代码片段)

(大数据必知必会:Hadoop(3)分布式集群环境安装)安装前准备集群环境下,至少需要3台服务器。IP地址主机名称10.0.0.5node110.0.0.6node210.0.0.7node3需要保证每台服务器的配置都一致,以下步骤在3台服务器上都需要做一次。操作系统... 查看详情

必知必会-使用kafka之前要掌握的知识(代码片段)

...介绍分区和分组队列还是分发消费方式API前记消息队列是分布式系统架构中不可或缺的基础组件,它主要负责服务间的消息通信和数据传输。市面上有很多的开源消息队列服务可以选择,除了kafka,还有Activemq,Roc... 查看详情

大数据必知必会:zookeeper伪分布式安装

安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi.bashrcexportJAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64让环境变量生效。so... 查看详情

mysql学习--mysql必知必会(代码片段)

?上图为数据库操作分类:??下面的操作參考(mysql必知必会)创建数据库运行脚本建表:mysql>createdatabasemytest;QueryOK,1rowaffected(0.07sec)mysql>showdatabases;+--------------------+|Database|+--------------------+|infor 查看详情

大数据必知必会:zookeeper伪分布式安装(代码片段)

大数据必知必会:Zookeeper(2)伪分布式安装安装前准备操作系统准备安装Java8+下载Zookeeper安装包伪分布式安装解压安装包修改配置文件相关命令启动Zookeeper查看状态验证Zookeeper停止Zookeeper安装前准备操作系统准备... 查看详情

mysql必知必会(代码片段)

.../hiszm.blog.csdn.net/article/details/119907136文章目录第一章:数据库基础基本概念什么是SQL第二章:MySQL简介第三章:了解数据库和表第四章:检索数据SELECT语句第五章:排序检索数据找出一列中最高或最低的值第六 查看详情

深入理解kafka必知必会

Kafka中的事务是怎么实现的?Kafka中的事务可以使应用程序将消费消息、生产消息、提交消费位移当作原子操作来处理,同时成功或失败,即使该生产或消费会跨多个分区。生产者必须提供唯一的transactionalId,启动后请求事务协... 查看详情

大数据必知必会:hadoop单机环境安装(代码片段)

(大数据必知必会:Hadoop(1)单机环境安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情

flink必知必会的重要基本知识

一、Flink基本知识1.1、Flink介绍ApacheFlink是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态计算。Flink官网:https://flink.apache.org/Flink的中文官网:https://flink.apache.org/zh/1.2、有界与无界1.2.1、有界数据... 查看详情

flink必知必会的重要基本知识

一、Flink基本知识1.1、Flink介绍ApacheFlink是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态计算。Flink官网:https://flink.apache.org/Flink的中文官网:https://flink.apache.org/zh/1.2、有界与无界1.2.1、有界数据... 查看详情

读书笔记sql必知必会(代码片段)

章节标题页数进度完成时间1了解SQL1~9100%2022-04-08 2检索数据SELECT10~22100%2022-04-103排序检索数据ORDERBY23~30100%2022-04-114过滤数据WHERE31~38100%2022-04-115高级数据过滤(组合WHERE,NOT,IN)39~49100%2022-04-166用 查看详情

大数据必知必会:hadoop高可用集群安装(代码片段)

(大数据必知必会:Hadoop(4)高可用集群安装)安装前准备高可用集群环境下,至少需要3台服务器,这里准备5台。IP地址主机名称角色10.0.0.5node1JournalNode、NameNode、ResourceManager10.0.0.6node2JournalNode、NameNode、ResourceManager10.0.0.7node3Journa... 查看详情

大数据linux必知必会-02(代码片段)

8网络配置8.1静态ip设置配置文件地址:/etc/sysconfig/network-scripts/ifcfg-ens33修改如下原来改成reboot重启下生效8.2修改linux主机名修改配置文件下的主机名/etc/hostname[root@hadoop~]#vim/etc/hostname修改映射文件/etc/sysconfig/network[root@hadoop~]#vim/etc 查看详情

mysql必知必会(初级篇)(代码片段)

mysql1.基本概念2.SQL语言2.1DCL(数据控制语言)2.1.1创建用户2.1.2使用grant命令给用户授权2.1.3使用revoke命令撤销权限2.2DDL(数据定义语言)2.2.1mysql常用约束类型2.2.2使用alter命令修改表结构2.2.3使用drop命令删除表2.3DML(数据操纵语言)2.3.1使... 查看详情

h5系列之history(必知必会)(代码片段)

H5系列之History(必知必会)目录概念兼容性属性方法H5方法概念理解HistoryApi的使用方式目的是为了解决哪些问题作用:ajax获取数据时,可以改变历史记录,从而可以使用浏览器的后退和前进。【】规范地址:http://www.w3.org/TR/html5... 查看详情