# 执行写入 (B)

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

-------------------------------------------------------------
涉及到被修改 region 的 TiKV 收到写入操作后，开启写入流程。这个流程主要由线程池模块 scheduler、raftstore 和 apply 。流程如下：

  - Scheduler 模块负责协调事务并发写入冲突，并将收到的修改操作向下写入，当有 key value 写入冲突（例如：锁冲突、版本冲突等）时 scheduler 使用 latch 来进行协调，获得 latch 的线程会将写入请求发送给 raftstore 模块，没有获得 latch 的线程会处于等待状态。
  - Raftstore 模块收到写请求后，将写请求转化为 raft log 后，写入到 rocksdb raft 中，rocksdb raft 负责持久化这些 Raft log。同时，raftstore 模块会将 raft log 复制到其他 TiKV （包含写入 region 的副本）上的 rocskdb raft 中，准备写入到其他 region 副本上。
  - 由于 rocksdb raft 中存储的为 Raft log，所以 apply 模块会将这些 raft log 应用到 rocksdb kv 中，这个时候，写入操作则被持久化到 rocksdb kv 中了。

综上所述，修改操作经过 Scheduler 进行并发控制写入到 raftstore 模块，转化为 raft log 后写入到 rocksdb raft 实例中并发送给其他含有副本的 TiKV 中的 rocksdb raft 实例中持久化，最后，由 apply 模块持久化到 rocksdb kv 实例中。

关于 RocksDB 的写入可以参考 Lesson 03: TiKV 中的 “RocksDB - 写入”。