0

事务提交通常是如何实现的?我的意思是我有一个事务日志(或更多不同页面类型的日志),它们根据一些缓冲区缓存策略(一个简单的 Guava 缓存)保存在 BerkeleyDB 数据库中。在事务提交期间,事务日志被读取并写入数据文件(当前仅允许单个写入事务)。

然而,这些提交是重量级的,因此似乎是一个瓶颈。

我的想法:事务日志首先在提交期间刷新到磁盘(但也保存在内存中),然后事务日志中的记录被一一读取并附加到“正常”数据文件中。之后从事务日志中删除条目。现在我应该能够基于以下事实重播崩溃的事务:如果事务日志仍然存在,则必须首先将剩余条目写入数据文件,然后才能继续进行新的写入事务。

然而,如前所述,除了重做操作不能按预期工作之外,提交本身就是一个瓶颈,因为除了实际的数据页之外,它还必须将 B+-tree 类页面结构的更改路径/页面写入磁盘。

也许人们也可以在线程池中的专用线程中发出提交,即将到来的事务首先检查事务日志中的一个标志,指示事务是否已提交,然后首先尝试从事务日志中读取,然后从数据中读取文件。

对于感兴趣的人:https ://github.com/JohannesLichtenberger/sirix

我目前也在寻找其他可能会花一些空闲时间的开源开发人员 ;-)

我还没有找到很多关于如何实现交易系统的文献。请注意,系统支持版本控制,并且仅在提交后附加新版本。

您认为我的第二种方法有效吗?否则什么是“最先进的”?但是,如果实现起来太复杂,我想我首先会优先考虑其他任务。

或者也许提供一个异步提交...... trx.asynchCommit() 用于需要提供非常快速更新并最终允许读取存储修订的应用程序。但是写入可能不是顺序的,因为另一个事务也可以提交,但是好的,它设计用于闪存盘,特别是随机读取仍然发生,但写入通常是顺序的。

4

0 回答 0