RocksDB 中的 MVCC 与事务实现:序列号与快照隔离详解
来源:artem.krylysov.com — 2026-07-23
📋 概述
这篇文章深入剖析了 RocksDB 如何在其 LSM-tree 架构上实现多版本并发控制(MVCC)和事务支持。核心机制是通过单调递增的序列号(sequence number)实现快照隔离——每个写入被分配一个序列号,每个读取捕获当前已发布的序列号,从而在不加锁的情况下提供一致性视图。
🔑 核心要点
- RocksDB 内部将每个键存储为(user_key, sequence_number, value_type) 三元组,利用序列号实现 MVCC 的多版本语义
- 读取操作捕获已发布序列号(published sequence),跳过序列号大于该值的所有写入——实现无锁的一致性快照读取
- 内部键排序策略:先按 user_key 升序,再按 sequence_number 降序,确保同键的最新版本优先被找到
- Memtable 使用并发跳表实现,读写操作均无需加锁——原子指针操作保证线程安全
- Compaction(垃圾回收)需要知道哪些快照仍在活跃,避免回收正在被读取的旧版本——这是 MVCC 实现中最微妙的并发问题
💡 金句
LSM-trees already never modify data in-place — that's half of MVCC for free. The other half is snapshots.
👍 0
👎 0
← 返回 Lobsters 首页