通常如何实施事务提交?我的意思是我有一个事务日志(或更多日志用于不同的页面类型),这些日志根据一些缓冲区缓存策略(一个简单的Guava缓存)保存在BerkeleyDB数据库中。在事务提交期间,事务日志被读取并写入数据文件(目前只允许单个写入事务)。
然而,这些提交是重量级的,因此似乎是一个瓶颈。
我的想法: 在提交期间,事务日志首先被刷新到磁盘(但也保存在内存中),然后逐个读取事务日志中的记录并将其附加到“普通”数据文件。之后,将从事务日志中删除条目。现在我应该能够重播崩溃的事务,因为如果事务日志仍然存在,则必须先将剩余的条目写入数据文件,然后才能继续执行新的写入事务。
然而,正如所述,除了重做操作以某种方式不能按预期工作之外,提交本身就是一个瓶颈,因为它还必须将B + -tree之类的页面结构的已更改路径/页面写入磁盘,除了实际数据页。
也许有人也可以在线程池中的专用线程中发出提交,并且即将发生的事务首先检查事务日志中的标志,指示事务是否已提交然后首先尝试从事务日志中读取然后来自数据文件。
感兴趣的人:https://github.com/JohannesLichtenberger/sirix
我目前也在寻找可能会花些时间的其他开源开发人员; - )
我还没有找到很多关于如何实现交易系统的文献。请注意,系统支持版本控制,并且仅在提交后附加新版本。
你认为我的第二种方法有效吗?否则什么是“最先进的”?但是,如果实施起来太复杂,我认为我首先要优先考虑其他任务。
或者可能为需要提供非常快速的更新并且最终允许对存储的修订版进行读访问的应用程序提供异步提交... trx.asynchCommit()。但是后来写入可能不是顺序的,因为另一个事务也可以提交,但好吧,它设计用于闪存盘,尤其是随机读取,但写入通常是顺序的。