如果在插入 memtable 时发生崩溃,leveldb 还能保持事务性吗?

问题描述

最近在学习leveldb的源码。

正如代码所示,当将新数据放入 leveldb 时。它首先将 放入 WAL 中,然后插入到 memtable 中的跳过列表中,然后向客户端返回 ok/err。

像这样:

define template
$(1).ttl: ../JSON/$(1).jsonld
    jsonld format -q $$^ ... > $$@
endef

$(foreach X,$(patsubst ../JSON/%.jsonld,%,$(JSONLD)),$(eval $(call template,$(X))))

我的问题是:

如果在阶段 2 和阶段 3 之间发生系统崩溃,导致 Write func 没有返回给调用者,并且新的 已经在 WAL 中。或者只是在 leveldb 中发生了一些内部错误,导致 Status Write() { //..... 1 log_->AddRecord(); //..... 2 status = insertInto(write_batch,mem_); //..... 3 return status; } 代码返回错误,然后在清除 WAL 之前,系统崩溃发生。当系统重新启动时,LevelDb 将恢复 WAL 中未提交的这些 (我的意思是返回 ok 给调用者)。

这会导致用户认为的数据与数据库中实际保存的数据不一致。这是否违反了交易的定义?

这种现象是否正确?还是因为我对代码理解有些问题?我希望得到你的帮助,谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...