基于java的数据库-mydb

MYDB是一个基于Java的简单数据库,模仿了MySQL、PostgreSQL和SQLite的部分原理。它实现了数据可靠性和恢复、两段锁协议、MVCC、两种事务隔离级别、死锁处理、表和字段管理等功能。数据库分为后端和前端,通过socket交互。TM模块管理事务状态,DM负责数据文件和日志管理,VM实现调度序列的可串行化,IM实现了B+树索引,TBM管理表和字段。
摘要由CSDN通过智能技术生成

MyDB

       MYDB 是一个 Java 实现的简单的数据库,部分原理参照自 MySQL、PostgreSQL 和 SQLite。实现了以下功能:

  • 数据的可靠性和数据恢复
  • 两段锁协议(2PL)实现可串行化调度
  • MVCC
  • 两种事务隔离级别(读提交和可重复读)
  • 死锁处理
  • 简单的表和字段管理
  • 简陋的 SQL 解析
  • 基于 socket 的 server 和client

       MYDB 分为后端和前端,前后端通过 socket 进行交互。前端(客户端)的职责很单一,读取用户输入,并发送到后端执行,输出返回结果,并等待下一次输入。MYDB 后端则需要解析 SQL,如果是合法的 SQL,就尝试执行并返回结果。不包括解析器,MYDB 的后端划分为五个模块,每个模块都又一定的职责,通过接口向其依赖的模块提供方法。

       TM 通过维护 XID 文件来维护事务的状态,并提供接口供其他模块来查询某个事务的状态。
       DM 直接管理数据库 DB 文件和日志文件。DM 的主要职责有:1) 分页管理 DB 文件,并进行缓存;2) 管理日志文件,保证在发生错误时可以根据日志进行恢复;3) 抽象 DB 文件为 DataItem 供上层模块使用,并提供缓存。
       VM 基于两段锁协议实现了调度序列的可串行化,并实现了 MVCC 以消除读写阻塞。同时实现了两种隔离级别。
       IM 实现了基于 B+ 树的索引,BTW,目前 where 只支持已索引字段。
       TBM 实现了对字段和表的管理。同时,解析 SQL 语句,并根据语句操作表。

Transaction Manager(TM)

  • 定义规则

       每个事物都有对应的xid,它唯一地标识了事物的状态。事务的xid从1开始,不断递增并且不可重复。规定XID=0是一个超级事务,当一些操作想在没有申请事务的情况下进行,可以将操作的XID设置为0,超级事务的状态永远是committed。其他事务的状态包括:
              0 - active,正在进行,尚未结束
              1 - committed,已提交
              2 - aborted,已撤销(回滚)
       TM维护了一个.XID格式的文件,用于保存事务的状态。XID文件为咩哥事务分配了一个字节的空间来保存其状态,另外文件还有长度8个字节的文件头,来表示文件管理的事务个数。所以,事务n在文件中的状态就储存在(n-1)+8个字节处,n-1是因为xid=0事务状态不需要记录。

public interface TransactionManager {
	long begin();                       // 开启一个新事务
	void commit(long xid);              // 提交一个事务
	void abort(long xid);               // 取消一个事务
	boolean isActive(long xid);         // 查询一个事务的状态是否是正在进行的状态
	boolean isCommitted(long xid);      // 查询一个事务的状态是否是已提交
	boolean isAborted(long xid);        // 查询一个事务的状态是否是已取消
	void close();                       // 关闭TM
}

另外还有两个静态方法:create() 和 open(),分别表示创建一个 xid 文件并创建 TM 和从一个已有的 xid 文件来创建 TM。从零创建 XID 文件时需要写一个空的 XID 文件头,即设置 xidCounter 为 0,否则后续在校验时会不合法。

// XID文件头长度
static final int LEN_XID_HEADER_LENGTH = 8;
// 每个事务的占用长度
private static final int XID_FIELD_SIZE =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值