Leveldb:是否存在写后读写危险?

时间:2016-02-16 13:18:40

标签: asynchronous leveldb

根据Leveldb的官方文件:

  

默认情况下,每次写入leveldb都是异步的:它在将进程写入操作系统后返回。从操作系统内存到底层持久存储的转移是异步发生的。

所以我想知道写后读写危险是否会发生:

  1. db->Put(leveldb::WriteOptions(), "key", "value1");
  2. (Step1完成后)db->Put(leveldb::WriteOptions(), "key", "value2"); //异步
  3. db->Get(leveldb::ReadOptions(), "key", &result); // result == "value1"而不是"value2"是否可能?
  4. 我写了一个程序来测试它:

    #include <iostream>
    #include <leveldb/db.h>
    #include <sstream>
    #include <cstdlib>
    #include <cassert>
    
    using namespace std;
    leveldb::DB* db;
    leveldb::Options options;
    
    int main()
    {
        options.create_if_missing = true;
        leveldb::DB::Open(options, "test.db", &db);
        for(int i=0; i<10000000; ++i)
        {
            stringstream ss;
            ss << i;
            string sbefore = ss.str();
            db->Put(leveldb::WriteOptions(), "x", sbefore);
            if (!(std::rand() % 4))
            {
                string safter;
                db->Get(leveldb::ReadOptions(), "x", &safter);
                assert(sbefore == safter);
            }
        }
        delete db;
    }
    

    在这种情况下,似乎断言总是正确的,但我不确定它是否是一般规则。

1 个答案:

答案 0 :(得分:0)

  

所以我想知道写后读写危险是否会发生:

     

[坏事]

不,你不必担心。 Put()s记录在内存中,并在每个Get()上检查;读取不是直接来自磁盘。看到DBImpl :: Get()的这一部分: https://github.com/google/leveldb/blob/dac40d25f6ce69c8b6685ab09f240cb63cfd5ab3/db/db_impl.cc#L1135