首页 > 解决方案 > 如果在插入 memtable 时发生崩溃,leveldb 是否仍能保持事务性?

问题描述

最近一直在学习leveldb的源码。

正如代码所示,将新数据放入 leveldb 时。它首先将 <key,val> 放入 WAL,然后插入到 memtable 的 skiplist 中,然后返回 ok/err 给客户端。

像这样:

Status Write() {
    //..... 1
    log_->AddRecord();
    //..... 2
    status = insertInto(write_batch, mem_);
    //..... 3
    return status;
}

我的问题是:

如果在阶段 2 和阶段 3 之间发生系统崩溃,导致 Write func 不会返回给调用者,并且新的 <key,val> 已在 WAL 中。或者只是在 leveldb 中发生了一些内部错误,导致insertInto(write_batch, mem_)代码返回错误,然后在清除 WAL 之前,发生了系统崩溃。当系统重新启动时,LevelDb 将恢复 WAL 中未提交的这些 <key, val>(我的意思是向调用者返回 ok)。

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

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

标签: transactionsnosqlleveldb

解决方案


推荐阅读