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;
}
如果我有
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;
}