目录
一、简介
TiDB 是开源的分布式数据库,是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品,具备水平扩容或缩容、金融级高可用、实时 HTAP、云原生分布式数据库、兼容MySQL5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP、OLAP、HTAP 解决方案。
很多数据库都会实现多版本并发控制(MVCC),TiKV也不例外。设想这样的场景,两个客户端同时去修改一个 Key 的 Value,如果没有多版本控制,就需要对数据上锁,在分布式场景下,可能会带来性能及死锁问题。
想要了解 TiDB 的 KV 存储请先查阅以前的文章:TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对_tidb 的key value是如何做到的-优快云博客
二、TiDB MVCC
TiKV 的 MVCC 实现是通过在 Key 后面添加版本号实现的,简单来说,没有 MVCC 之前,可以把 TiKV 看成:
Key1 -> Value
Key2 -> Value
……
KeyN -> Value
有了MVCC之后,TiKV的Key排列是这样的:
Key1_Version3 -> Value
Key1_Version2 -> Value
Key1_Version1 -> Value
……
Key2_Version4 -> Value
Key2_Version3 -> Value
Key2_Version2 -> Value
Key2_Version1 -> Value
……
KeyN_Version2 -> Value
KeyN_Version1 -> Value
……
注意,同一个 Key 的多个版本,版本号较大的会被放在前面,版本号小的放在后面,这样当用户用户通过一个 Key + Version 来获取 Value 时,可以通过 Key 和 Version 构造出 MVCC 的Key,也就是 Key_Versoin。然后可以通过 RocksDB 的 SeekPrefix(Key_Version) API,定位到第一个大于等于这个 Key_Version 的位置。
2.1 MVCC 流程
TiDB 实现 MVCC(多版本并发控制)的主要目的是为了支持高并发读写场景下的事务处理,同时保持数据的一致性。以下是 TiDB 中 MVCC 实现的简化流程概述:
- 启动事务获取事务 ID:当一个事务开始时,TiDB 的 PD 组件会分配一个全局唯一的事务ID,也称为 Start Timestam(StartTs)