# GC机制及相关模块

![`smart`](GCMechanism_aa_002_20220509.png)

------------------------------------------------------------
TiDB事务实现使用MVCC（多版本并发控制）机制。当新写入的数据覆盖旧数据时，旧数据不会被替换，而是被保留，TiKV中的键值对的键上的时间戳用于区分版本。GC任务是清理不再需要的旧数据。MVCC的原理和实现将在TiKV单元中介绍。

GC 整体流程：
- 一个TiDB实例在TiDB集群中会被选为GC领导者，GC的操作将由GC领导者控制。

GC定期被触发。在每个GC点，TiDB服务器首先计算一个时间戳，称为安全点，在安全点之前生成的所有先前版本被认为是过时的，需要由GC移除。每轮GC分为以下三个步骤：
- `Resolve Locks:` 扫描所有区域，发现过期（在安全点之前）的数据，并且清理任何锁定数据。
- 这个阶段快速删除由操作（如`DROP TABLE`和`DROP INDEX`等）引起的整个范围的过时数据，注意删除操作在安全点之前。
- `Execute GC:` 在这个阶段，每个 TiKV 实例将扫描该存储上的数据，并删除不再为每个键所需的过时版本。

默认情况下，GC每10分钟触发一次，每次GC保留最近10分钟的数据（即默认的GC生命周期为10分钟，安全点计算为当前时间减去GC生命周期）。如果一轮GC运行时间太长，下一轮GC将不会在下一次GC触发时启动，即使是下一次GC触发的时间。此外，为了确保长期事务能够正常运行超出GC生命周期，安全点不会超过活动事务的开始时间（start_ts）。