MYDB仿MySQL手写数据库项目总结

news2025/4/23 4:30:50

声明:该项目是一个开源项目,我是在学习该项目,该项目的github地址如下: 

MYDB项目地址:https://github.com/CN-GuoZiyang/MYDB 

MYDB项目采用C/S结构,支持启动一个服务器,并有多个客户端去连接,通过socket通信。

不算解析器的话,该项目分为五个模块:

transaction manager(TM):通过维护XID文件来维护事务的状态,并提供接口供其他模块来查询事务的状态。

data manager(DM):管理数据库的DB文件和日志文件。

version manager(VM):基于两段锁协议实现调度序列的可串行化,并实现MVCC以消除读写阻塞,实现两种隔离级别。

index manager(IM):实现B+树索引。

Table manager(TBM):实现对字段和表的管理,同时解析SQL语句,并根据语句操作表。

项目亮点:

一、基于Java NIO实现数据页的读写管理模块,数据访问效率比第一版的传统I/O快三倍

 

NIO 是 Java SE 1.4 引入的一组新的 I/O 相关的 API,它提供了非阻塞式 I/O、选择器、通道、缓冲区等新的概念和机制。相比与传统的 I/O 多出的 N 不是单纯的 New,更多的是代表了 Non-blocking 非阻塞,NIO具有更高的并发性、可扩展性以及更少的资源消耗等优点。

 

NIO是同步非阻塞的,服务器实现模式为 一个线程处理多个连接。服务端只会创建一个线程负责管理Selector(多路复用器),Selector(多路复用器)不断的轮询注册其上的Channel(通道)中的 I/O 事件,并将监听到的事件进行相应的处理。每个客户端与服务端建立连接时会创建一个 SocketChannel 通道,通过 SocketChannel 进行数据交互。

详细认识NIO可以看一下另一个博主写的一篇博客很详细:Java NIO 详解-CSDN博客

 二、设计日志模块,采用WAL机制操作日志,支持数据库宕机后数据恢复

什么是WAL机制?

WAL(Write-Ahead Logging,预写式日志) 是一种用于保证数据库事务持久性(Durability)原子性(Atomicity)的核心机制。其核心思想是:在修改数据之前,先将修改操作记录到日志中,再将数据写入磁盘。即使系统崩溃,也能通过日志恢复未完成的操作。

 WAL的核心流程

  1. 事务提交时

    • 将事务的修改操作(如插入、更新、删除)按顺序追加写入日志文件(WAL文件)。

    • 日志写入成功后,事务才被视为已提交

  2. 数据写入磁盘

    • 实际的数据文件(如数据库表文件)的修改可以异步完成,无需立即写入。

  3. 崩溃恢复

    • 系统重启后,通过重放(Replay)日志文件,将未落盘的操作重新应用到数据文件中,确保数据一致性。

 数据恢复:

因为MYDB要实现多线程下的工作方式:

所以为了确保数据恢复时能够正确恢复,我们要限制数据库的操作,有以下两种规定:

规定1:正在进行的事务,不会读取其他任何未提交事务产生的数据。

规定2:正在进行的事务,不会修改其他任何未提交的事务修改或产生的数据。

这样数据库崩溃时恢复数据就很简单了:

1.重做所有崩溃时已经完成(已经提交或需要回滚)的事务。

2.撤销所有崩溃时未完成(未提交的)的事务。

redo:

  1. 正序扫描事务 T 的所有日志

  2. 如果日志是插入操作 (Ti, I, A, x),就将 x 重新插入 A 位置

  3. 如果日志是更新操作 (Ti, U, A, oldx, newx),就将 A 位置的值设置为 newx

undo:

  1. 倒序扫描事务 T 的所有日志

  2. 如果日志是插入操作 (Ti, I, A, x),就将 A 位置的数据删除

  3. 如果日志是更新操作 (Ti, U, A, oldx, newx),就将 A 位置的值设置为 oldx

三、实现事务管理以及MVCC并发控制,基于两阶段锁协议(2PL)确保事务串行化,支持读已提交、可重复读两种隔离机制

在VM模块,VM向上层模块提供记录作为最小操作单元,即Entry,结构为三部分:XMIN(创建该Entry的事务ID)、XMAX(删除该Entry的事务ID)、data(数据)。

什么是MVCC并发控制?

MVCC是多版本并发控制,简单来说就是为每一条记录都创建多个版本,用来实现可以在不加锁的情况下读写无阻塞,根据相关规则读取某个版本的数据。

两阶段锁协议(2PL)

当一个事务对一个记录正在操作时,即已经上锁了,若另一个事务也想操作该数据,只能进入阻塞状态直到当前事务释放锁。 

读已提交和可重复读可以去看我之前写的一篇博客:MySQL的事务原理及MVCC-CSDN博客

四、基于B+树构建索引结构,在 6 万条记录下索引查询耗时由原生遍历的 120ms 降至 1ms 

对B+树结构索引不熟悉的可以看我写过的一篇博客:MySQL中的索引_innodb引擎默认索引-CSDN博客

五、构建表结构管理器,支持字段结构定义与 SQL 语句解析执行,支持多条件组合查询、插入、更 新等基本 SQL 语义操作 

SQL解析是通过里面一个分割相关的类把SQL语句分割成不同的部分,比如关键字、字母下划线、字符串等等,然后通过praser解析类先来判断第一个部分的关键字,比如select、insert等等,然后把同一类的SQL交给不同的方法解析。

六、实现死锁检测机制,及时中止死锁事务,防止系统进入长时间等待状态 

因为有两阶段锁协议(2PL),当一个事务对一个资源上锁之后,其他事务只能阻塞等待,而这样有死锁的可能,在项目中,我们把事务Ti等待事务Tj解锁抽象为一条有向边,即Ti->Tj,这样多条有向边就组成图,我们通过检查这个图是否是循环的,就可以来检查是否有死锁。

我们可以通过dfs来遍历图

思路:维护一个 xidStamp 哈希表,记录每个事务的时间戳。时间戳初始为1,每开启一轮新检测就自增。 对每个持有资源的事务(xid),如果未被当前轮次检测过(时间戳为空或旧值),则用新的时间戳发起DFS检查。如果DFS过程中遇到已被标记为当前时间戳的事务,说明形成了循环链,立即返回死锁。如果事务未等待任何资源(waitU中无记录),说明路径安全;如果所有事务遍历完均无环路,则系统无死锁。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git忽略已跟踪的文件/指定文件

在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…

RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系

以下是 RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系: 一、RAG(Retrieval-Augmented Generation) 1. 核心原理 …

6.QT-常用控件-QWidget|windowTitle|windowIcon|qrc机制|windowOpacity|cursor(C++)

windowTitle API说明windowTitle()获取到控件的窗⼝标题.setWindowTitle(const QString& title)设置控件的窗⼝标题. 注意!上述设置操作针对不同的widget可能会有不同的⾏为. 如果是顶层widget(独⽴窗⼝),这个操作才会有效. 如果是⼦widget,这个操作⽆任何效果. 代码⽰例…

Excel/WPS表格中图片链接转换成对应的实际图片

Excel 超链图变助手(点击下载可免费试用) 是一款将链接转换成实际图片,批量下载表格中所有图片的转换工具,无需安装,双击打开即可使用。 表格中链接如下图所示: 操作方法: 1、双击以下图标&a…

PostgreSQL基础

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…

win11修改文件后缀名

一、问题描述 win11系统中,直接添加.py后缀后仍然是txt文本文件 二、处理方式: 点击上方三个小点点击“选项”按钮 点击“查看”取消“隐藏已知文件类型的扩展名”选项点击“应用” 此时,“.txt”文件后缀显示出来了。将txt删去&#xff0c…

Navicat连接数据库密码忘了如何解析

1、首先打开Navicat导出密码 打开文件---》导出链接----》选择连接并勾选导出密码 2、用编辑器打开复制密码 把password后面的密码复制出来 3、打开php编辑器,我这边因为平时不用就在网上找了一个在线编辑器 地址: https://www.w3cschool.cn/tryrun/runcode?la…

OpenStack Yoga版安装笔记(22)Swift笔记20250418

一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介(Introduction to Object Storage) OpenStack 对象存储&a…

18、TimeDiff论文笔记

TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff(架构)原理训练推理其他关键点解释 DDPM(相关数学)1、正态分布2、条件概率1. **与多个条件相关**&…

Linux环境下使用ADB命令做嵌入式开发

介绍 adb一般是给Android开发用的,但是换个思路也能做嵌入式Linux开发 安装 以Ubuntu20.04为例 sudo apt install android-tools-adb android-tools-fastboot安装成功可以查看adb版本号 命令 查看adb设备 登录shell 上传文件到设备指定目录 拉取设备上的文件到…

深度学习方向急出成果,是先广泛调研还是边做实验边优化?

目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例:本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…

级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记

编者按: A16Z在《AI Voice Agents: 2025 Update》中提到: 语音是 AI 应用公司最强大的突破之一。 它是人类沟通中最频繁(也是信息密度最高的)形式,AI 也让其首次变得“可编程”。 在13期Z沙龙,我们聚焦AI…

阿里云镜像加速仅支持阿里云产品了

最近在拉取docker镜像时一直报超时的错误: docker pull hello-world Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exce…

05--MQTT物联网协议

一、MQTT的概念 MQTT 协议快速入门 2025:基础知识和实用教程 | EMQ 1.MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它…

学习设计模式《二》——外观模式

一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】; 外观模式的说明:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,然后在这些方法里面实现;由外观类再去分别调用内部的多个…

永磁同步电机控制算法-VF控制

一、原理介绍 V/F 控制又称为恒压频比控制,给定VF 控制曲线 电压是频率的tt例函数 即控制电压跟随频率变化而变化以保持磁通恒定不变。 二、仿真模型 在MATLAB/simulink里面验证所提算法,搭建仿真。采用和实验中一致的控制周期1e-4,电机部分计算周期为…

qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded

项目场景: 环境版本: qt :5.14.2 mysql:8.0 windows:10 提示:qt 配置 mysql 驱动: 项目场景:qt 配置 mysql 驱动 问题描述 提示:这里描述项目中遇到的问题:…

线性代数 | 知识点整理 Ref 2

注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 2。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 【数学】线性代数知识点总结 阿巴 Jun 于 2024-…

华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调…

Flink-01学习 介绍Flink及上手小项目之词频统计

flink简介 官网 概述: 学习Flink具体包括四个关键概念:流数据的持续处理,事件时间,有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架,旨在处理批处理和实时数据处理,具有高吞吐量和低延迟的…