leveldb writebatch 并发问题

leveldb writebatch concurrency issue

如果我有

using (WriteBatch batch = new WriteBatch())
{
    for(int i=0; i<100; i++)
    {
        batch.Put(i.ToString(), i.ToString())
    }
    leveld_db.Write(batch);
}

来自一个线程和

using (WriteBatch batch = new WriteBatch())
{
    for(int i=0; i<100; i++)
    {
        batch.Put(i.ToString(), (i+1000).ToString())
    }
    leveld_db.Write(batch);
}

来自另一个并发线程,是否可以保证我不会得到像 {10, 10} {11, 1011} 这样的数据?

假设您想知道 leveldb 中 WriteBatch 操作的线程安全性。
答案是肯定的,这个操作是线程安全的。其实leveldb中的每一个操作都是使用WriteBatch实现的:

Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) {
  WriteBatch batch;
  batch.Put(key, value);
  return Write(opt, &batch);
}

写入操作排队以避免竞争:

  writers_.push_back(&w);
  while (!w.done && &w != writers_.front()) {
    w.cv.Wait();
  }
  if (w.done) {
    return w.status;
  }