2016-06-09 92 views
0

如果我有性LevelDB writebatch併發問題

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}數據最終保證嗎?

回答

1

假設您想知道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); 
} 

和寫OPS排隊,避免賽車:

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