# 写入的执行 

__*写入的执行*__
__*Transaction*__
__*KV*__
__*TiKV Client*__

![`smart`](ExecuteandWrite01_aa_005_20220512.png)
-------------------------------------------------------------
写入流程会首先将需要修改的数据读入 TiDB server 的缓存中, 图中的 memBuffer 代表 TiDB server 的缓存。

下面我们从需要修改的数据已经读取到 TiDB server 缓存中开始进行介绍, 在 TiDB server 中参与写入的线程池模块主要有: Transaction, KV 和 TiKV Client 。流程如下:

1. Transaction 模块开始进入二阶段提交, 这里我们简要地将其理解为两步操作, 第一个是 Prewrite 操作, 也就是修改数据和加锁, 第二个是 Commit 操作, 也就是提交修改, 释放锁。那么这两个操作中的修改数据、加锁、释放锁和提交修改都是算写操作。 Transaction 会先从头遍历 memBuffer 缓存, 缓存中的 key 是有序排列的, 之后将事务需要进行的修改发送给 KV 模块。这里需要注意: 在二阶段提交中的 Commit 操作, 除了写数据, 在之前会向 PD 申请获取当前的 TSO 作为当前事物的 commit_ts。这样一个事务就有提交（结束时）的 commit_ts。

2. KV 模块负责将事务相关的操作（写入、提交、回滚、加锁和释放锁等）封装为写操作, 发送给 TiKV Client 模块。

3. 封装好的写操作通过 TiKV Client 模块发送给相关的 TiKV server。


