# 执行写入 (A)

![center](./student-guide/diagram/05-Write-execution-01-01.png)

-------------------------------------------------------------
写入流程会首先将需要修改的数据读入 TiDB Server 的缓存中，图中的 memBuffer 代表 TiDB Server 的缓存，这个读入操作和之前介绍的 DML 语句读流程一致，我们可以参考前面介绍的：SQL 的 Parse 与 Compile 和读取的执行(A)～(C)。

下面我们从需要修改的数据已经读取到 TiDB Server 缓存中开始进行介绍，在 TiDB Server 中参与写入的线程池模块主要有：Transaction，KV 和 TiKV Client，关于这三个线程池的介绍请参考 Lesson 02: TiDB Server 。流程如下：
  - Transaction 模块开始进入二阶段提交，关于二阶段提交会在 Lesson 03: TiKV 的“分布式事务”中进行介绍，这里我们简要地将其理解为 2 步操作，第一个是 prewrite 操作，也就是修改数据和加锁，第二个是 commit 操作，也就是提交修改，释放锁。那么这 2 个操作中的修改数据、加锁、释放锁和提交修改都是算写操作，所以，我们后面介绍写操作就可以了。
  Transaction 会先从头遍历 memBuffer 缓存，缓存中的 key 是有序排列的，之后将事务需要进行的修改发送给 KV 模块。

这里需要注意： 在二阶段提交中的 commit 操作，除了写数据，在之前会向 PD 申请获取当前的 TSO 作为当前事物的 commit_ts。这样一个事务就有提交（结束时）的 commit_ts。
  - KV 模块负责将事务相关的操作（写入、提交、回滚、加锁和释放锁等）封装为写操作，发送给 TiKV Client 模块。
  - 封装好的写操作通过 TiKV Client 模块发送给相关的 TiKV 。
