MYDB 是一个 Java 实现的简单的数据库,部分原理参照自 MySQL、PostgreSQL 和 SQLite。实现了以下功能:
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 语句,并根据语句操作表。
每个事物都有对应的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 =
本文发布于:2024-02-03 07:15:22,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170691572249471.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |