当前位置:   article > 正文

基于java的数据库-mydb

mydb

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

另外还有两个静态方法: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 =
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/869424
推荐阅读
相关标签
  

闽ICP备14008679号