FREE SOLO - 自己动手实现Raft - 16 - leveldb源码分析与调试-2
本文聚焦于leveldb的源码写入机制,包括log的源码写入与memtable的写入过程。在深入分析之前,源码让我们回顾leveldb的源码核心数据结构,这将为后续的源码探讨提供直观的参考。
数据写入流程主要包括两个阶段:首先,源码b站工程源码将数据写入log,源码紧接着将数据写入memtable以供查询。源码
在log的源码写入过程中,数据经由一系列封装,源码最终通过调用log::Writer::AddRecord实现写入。源码在这一过程中,源码数据通过DBImpl::Put和DB::Put进行封装,源码战机火控源码最终由DBImpl::Write调用实现。源码
对于memtable的源码写入,数据同样经历DBImpl::Put和DB::Put的封装,随后由DBImpl::Write和MemTableInserter::Put进行处理,最后调用MemTable::Add完成写入。这一系列操作确保了数据的高效存储与检索。
数据读取方面,主要依赖于DBImpl::Get调用,通过MemTable::Get和SkipList::FindGreaterOrEqual操作在SkipList中进行搜索,实现从memtable中读取数据。同时,数据也可从sorted table中获取。520源码之家
总结整个流程,本文主要梳理了数据写入与读取的调用栈,以及memtable与log在leveldb中的角色。下一次,我们将深入探讨大量数据写入后,内存与磁盘中数据状态的变化,以进一步理解leveldb的高效与可靠。
期待下次的分享,敬请关注!
toydb源码阅读-MVCC
实现MVCC(多版本并发控制)的DBMS内部维持着单个逻辑数据的多个物理版本,当事务修改数据时,就创建新的模型源码笔记版本。事务读取时,根据事务的开始时间,读取事务开始时刻之前的最新版本。MVCC的核心概念是,只读事务无需加锁即可读取数据库某一时刻的快照,保留数据的所有历史版本,DBMS甚至能支持读取任意历史版本的数据。在toydb中,这种特性被实现,即不实现垃圾回收(GC),保留所有版本,开发者特别强调这是信息填报源码功能而非错误。
并发控制方面,MVCC主要解决读写(R-W)冲突,但对于写入(W-W)冲突,仅靠MVCC本身无法解决,需要引入其他并发协议。toydb实例中,事务的时间或版本基于事务的开始决定。例如,事务T2读取的物理时间可能落后于T5,但T2事务开始早于T5,因此T2能读取到的数据版本早于T5。记录真正可见是根据提交的时刻决定的,事务未提交前,其写入的数据对自身可见,但对其他事务不可见。理解这一概念需要结合具体的并发控制协议。
在Miniob中,MVCC的实现相对简洁。版本基于tid(事务标识),每条记录会生成两个sys_field,分别存储事务的开始时间(begin)和结束时间(end),标识事务的可见性。Miniob中的隔离级别为快照隔离,未提交事务的begin值小于0,因此无法读取到新写入的记录,避免了幻读情况。判断记录是否可见的逻辑在visit_record函数中提供。
toydb的MVCC实现集中在src/storage/mvcc.rs文件中,文件结构清晰,辅助支持如debug.rs、keycode.rs提供额外功能,但核心在于Transaction和MVCC结构体的实现。TransactionState结构体用于安全地传递事务状态,有助于简化事务管理,但并未在MVCC实现中体现。在TransactionState中,提供了一个函数来判断给定版本是否对当前事务可见,基于事务的状态和版本信息进行判断。
toydb中,事务和存储引擎之间通过KV存储引擎交互,实现MVCC功能。对于只读事务和读写事务,toydb提供了不同的开始函数。在写入和删除操作中,toydb通过write_version函数实现,首先检查冲突,然后写入TrnWrite和Version。MVCC的实现包括begin、commit、rollback等关键操作,保证了事务的原子性、可重复读和时间一致性。active_set机制帮助解决了事务提交或回滚时更改的可见性问题,确保了原子性提交和可重复读的实现。
toydb的MVCC模块设计简洁,功能强大,仅余行代码就实现了关键的并发控制逻辑。复合类型Key的支持使得复合数据结构的实现更加直观,同时KV存储引擎不仅用于数据存储,还用于事务日志记录,实现了功能整合。此外,toydb提供了完善的测试和调试支持,简化了功能验证和性能优化的过程。总体来说,toydb的MVCC实现是高效、灵活且易于维护的。
2024-11-20 13:16
2024-11-20 12:51
2024-11-20 11:32
2024-11-20 10:53
2024-11-20 10:44