https://cloud.tencent.com/developer/article/1608073

关键内容说明:

  1. TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Primary Key,其他的则为Secondary keys。
  2. 当Primary Key提交成功,标识整个事务提交成功,否则失败。
  3. Secondary keys,则是等Primary Key提交成功后,异步并行提。
  4. pd 会产生全局唯一递增时间戳tso

TiDB二阶段提交简图

(图1,底图选用tidb官方)

细节描述

在图中④之前还有几部操作:

1. tidb 开始prewrite操作:向所有涉及改动的 region 并发执行 prewrite 请求,如果某个prewrite失败了。

如果报错为 keylslookWriteConfict, 都会重新获取tso,重新启动2pc。其他错误则会报错。

2.在tidb 开始commit 也就是图⑥的时候会执行,

tidb向primay所在的region发起commit。

如果失败 先执行回滚操作,然后根据错误判断是否重试:

lockNotEXist重新获取tso作为start_ts 启动2pc提交。

这几步操作,我简单描述一下 在tidb开始写key的操作,如果遇到锁相关的错误,都会进行一个重新获取tso,重新启动2pc的提交。

TiKV二阶段提交简图

(图2,底图选用tidb官方,图中的⑦应该是TiKV的准备操作)

TiDB的二阶段提交,还应该包含TiDB对TiKV的二阶段提交,下面用问答的形式来简单说明一下。

问:那么什么时候 TiDB会对TiKV发起二阶段提交?

答:在图1中⑥操作成功之后,TiDB向客户端返回事务成功之前,TiDB会对TiKV发起二阶段提交。

问: TiKV在二阶段提交中如何保证key的一致性?

答:图2中的⑦就是TiKV准备的操作,先对被操作的key进行锁冲突检测,然后对被操作的key进行加锁的一个操作。

在图2中的 ③和④其实为了保证,key已经在TiKV的准备工作中,已经被锁住。然后在内存中循环添加key的信息write(key,start_ts,commit_ts)写入一条,和删除锁住key的信息lock(key,start_ts)。当数据没有问题 在写入底层的raft-key中,从而保证了一致性。

从此整个TiDB二阶段提交提交大体完成。

总结,在二阶段提交中

PD 提供:提供全局唯一递增时间戳 tso发放。管理 raft-kv 集群

TiKV提供:分布式 kv 存储引擎,提供了 mvcc 功能。可以读取到历史版本数据。

TiDB提供:MySQL协议的解析,相对TiKV而已TiDB是客户端。

[转帖]浅析TiDB二阶段提交的更多相关文章

  1. RocketMQ源码分析之RocketMQ事务消息实现原理上篇(二阶段提交)

    在阅读本文前,若您对RocketMQ技术感兴趣,请加入 RocketMQ技术交流群 根据上文的描述,发送事务消息的入口为: TransactionMQProducer#sendMessageInTra ...

  2. InnoDB事务的二阶段提交

    问题: 什么是二阶段提交 为什么需要二阶段提交 二阶段提交流程 什么是二阶段提交? ### 假设原来id 为10 的记录age 为5 begin; update student set age = 1 ...

  3. Mysql事物与二阶段提交

     1.事务的四种特性(ACID) 事务可以是一个非常简单的SQL构成,也可以是一组复杂的SQL语句构成.事务是访问并且更新数据库中数据的一个单元,在事务中的操作,要么都修改,要么都不做修改,这就是事务 ...

  4. mysql原理~二阶段提交

    一 简介:今天咱们来聊聊 mysql 两阶段提交二 事务过程    perpare-commit 两个过程1  perpare阶段 redo日志   1.设置undo state=TRX_UNDO_P ...

  5. (七) Mysql 之 binlog redolog 二阶段提交

    (一)背景知识: 1 binlog binlog 我们中文一般称作归档日志, 是 MySQL Server 层的日志,而不是存储引擎自带的日志,它记录了所有的 DDL 和 DML(不包含数据查询语句) ...

  6. innodb二阶段日志提交机制和组提交解析

    前些天在查看关于innodb_flush_log_at_trx_commit的官网解释时产生了一些疑问,关于innodb_flush_log_at_trx_commit参数的详细解释参见官网: htt ...

  7. DTP模型之一:(XA协议之一)XA协议、二阶段2PC、三阶段3PC提交

    XA协议 XA是一个分布式事务协议,由Tuxedo提出.XA中大致分为两部分:事务管理器和本地资源管理器.其中本地资源管理器往往由数据库实现,比如Oracle.DB2这些商业数据库都实现了XA接口,而 ...

  8. 分布式事务(一)两阶段提交及JTA

    原创文章,同步发自作者个人博客 http://www.jasongj.com/big_data/two_phase_commit/ 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或 ...

  9. 两阶段提交及JTA

    两阶段提交及JTA 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或者提供事务语义的系统,如JMS)的事务.其实就是将对同一数据库事务的概念扩大到了对多个数据库的事务.目的是为了保 ...

  10. 分布式事务、XA、两阶段提交、一阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...

随机推荐

  1. BFS(一)单词接龙

    对应 LeetCode 127 单词接龙 问题定义 给定一个字典序列 wordList,一个初始的单词 beginWord 和一个目标单词 endWord,现在要求每次变换满足以下条件将 beginW ...

  2. QRCoder1.4.3生成二维码,不依赖System.Drawing,解决"未能找到类型或命名空间名QRCode","及ImageFormatPng仅在windows上受支持"

    生成二维码1(简单) 包引用: <PackageReference Include="QRCoder" Version="1.4.3" /> usi ...

  3. 基于FPGA的电子琴设计(按键和蜂鸣器)---第一版---郝旭帅电子设计团队

    本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版. 功能说明: 外部输入七个按键,分别对应音符的"1.2.3.4.5.6.7",唱作do.re.mi.fa. ...

  4. Mybatis之TypeHandler使用教程

    引言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...

  5. 实践GoF的设计模式:访问者模式

    摘要:访问者模式的目的是,解耦数据结构和算法,使得系统能够在不改变现有代码结构的基础上,为对象新增一种新的操作. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:访问者模式> ...

  6. Angular:都2021年了,你为啥还没用Angular

    摘要:数据绑定是将应用程序UI或用户界面绑定到模型的机制.使用数据绑定,用户将能够使用浏览器来操纵网站上存在的元素. Web开发需要模型和视图之间的数据同步.这些模型基本上包含数据值,而视图则处理用户 ...

  7. 顶会VLDB'22论文解读:多元时序预测算法METRO

    摘要:本文提出了一个端到端的MTS预测框架METRO.METRO的核心思想是利用多尺度动态图建模变量之间的依赖关系,考虑单尺度内信息传递和尺度间信息融合. 本文分享自华为云社区<VLDB'22 ...

  8. 从原理带你掌握Spring MVC拦截处理器知识

    摘要:SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理. 本文分享自华为云社区<不讲废话,全程干货,0基础带你学习Spring ...

  9. vue2升级vue3:Vue Router报错,directly inside <transition> or <keep-a

    vue3 报这个错误: vue-router.mjs:35 [Vue Router warn]: <router-view> can no longer be used directly ...

  10. 总结vue3 的一些知识点:MySQL 运算符

    MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算 ...