# 写入的执行 

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

![left](./student-guide/diagram/ExecuteandWrite01_aa_002_20220512.png)
-------------------------------------------------------------
写入流程会首先将需要修改的数据读入 TiDB Server 的缓存中,图中的 memBuffer 代表 TiDB Server 的缓存,这个读入操作和之前介绍的 DML 语句读流程一致,我们可以参考前面介绍的:SQL 的 Parse 与 Compile 和读取的执行。

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

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

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

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