
手写一个数据库
文章平均质量分 83
Jayfee11
这个作者很懒,什么都没留下…
展开
-
手写数据库轮子项目 MYDB 之十 | 客户端与服务端
MYDB 被设计为 C/S 结构。支持启动一个服务器,并有多个客户端去连接,通过 socket 通信,执行 SQL 返回结果。原创 2023-09-18 15:13:52 · 320 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之九 | TableManager (TBM) 字段解析与表管理
TBM,即表管理器的实现。TBM 实现了对字段结构和表结构的管理。原创 2023-09-18 15:13:37 · 414 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之八 | IndexManager (IM) 索引
IM,即 Index Manager,索引管理器,为 MYDB 提供了基于 B+ 树的非聚簇索引。索引的数据被直接插入数据库文件中,而不需要经过版本管理。原创 2023-09-18 15:13:20 · 259 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之六 | VersionManager (VM) 版本之记录的版本与事务隔离
由两个阶段组成,加锁阶段和释放锁阶段。在加锁阶段,事务需要获取所需数据的锁,锁定数据防止其他事务对其进行修改;在释放锁阶段,事务需要释放已经获取的锁,使得其他事务可以访问该数据。事务在释放锁之后,不能再申请和获得任何其他封锁。2PL 确实保证了调度序列的可串行化,但是不可避免地导致了事务间的相互阻塞,甚至可能导致死锁。MYDB 为了提高事务处理的效率,降低阻塞概率,实现了 MVCC。通过 MVCC 实现了类似共享锁和排他锁。两阶段提交协议与两阶段锁协议不同,是针对主从数据库之间的同步。原创 2023-09-18 15:13:00 · 342 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之七 | VersionManager (VM) 版本之死锁检测与 VM 的实现
两阶段锁协议(2PL)通常包括扩张和收缩两个阶段。在扩张阶段,事务将获取锁,但不能释放任何锁。在收缩阶段,可以释放现有的锁,但不能获取新的锁,这种规定存在着死锁的风险。2PL 会阻塞事务,直至持有锁的线程释放锁。可以将这种等待关系抽象成有向边,例如 Tj 在等待 Ti,就可以表示为 Tj --> Ti。这样,无数有向边就可以形成一个图(不一定是连通图)。检测死锁也就简单了,只需要查看这个图中是否有环即可。创建一个 LockTable 对象,在内存中维护这张图。原创 2023-09-18 15:12:23 · 180 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之五 | DataManager (DM) 数据之页面索引与向上管理 DataItem
AbstractCache 抽象类是一个引用计数法的缓存框架。维护了三个 HashMap:cache(实际缓存的数据),references(缓存的数据的被引用数),getting(数据是否被线程正在获取)。原创 2023-08-30 16:07:00 · 305 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之三 | DataManager (DM) 数据之数据页缓存与管理
本节我们介绍数据页在缓存中的定义和管理方法。DM 将文件系统抽象为一个个的页面,每次对磁盘中数据文件的读写是以页面为单位的。从磁盘中读进来的数据也是以页面为单位缓存的。原创 2023-08-30 16:06:35 · 358 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之四 | DataManager (DM) 数据之日志文件与恢复策略
MYDB提供数据库崩溃后的恢复功能,DM 模块在每次对底层数据操作时,都会记录一条日志到磁盘上。在数据库崩溃之后(即第一页校验不对时),再次启动时,可以根据日志的内容,恢复数据文件,保证其一致性。原创 2023-08-30 16:06:50 · 447 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之二 | DataManager (DM) 数据之缓存
DM 管理数据库的 DB 文件和日志文件。它是上层模块和下层文件系统的中间层,向上提供数据的包装,向下将数据写入磁盘。DM 的主要职责有:1) 抽象 DB 文件为 DataItem 供上层模块使用,并提供缓存;2) 分页管理 DB 文件,并进行缓存;3)管理日志文件,保证在发生错误时可以根据日志进行恢复。原创 2023-08-30 16:06:22 · 316 阅读 · 0 评论 -
手写数据库轮子项目 MYDB 之一 | TransactionManager (TM) 事务
TransactionManager (TM) 模块维护了一个自定义的 XID 格式的文件,并提供接口供其他模块来查询某个事务的状态。每个事物都有一个 XID,它表明了这个事物的唯一性。事物的 XID 从1开始不断递增。事物的状态包括:0 - active,正在进行,尚未结束1 - committed,已提交2 - aborted,已撤销(回滚)TM通过维护一个自定义的XID格式文件来保存当前和过去事物的状态。文件中前8个字节记录了文件管理的事务个数,从第9个字节开始,每个字节记录一个事物的状态。原创 2023-08-06 14:17:22 · 936 阅读 · 0 评论