原子更新 - Atomic Updates

注意:上面的操作如果进程在Put key2Delete key1两个操作之间结束,那么这两个键将存储相同的值。因此,尽可能使用WriteBatch类来避免这类问题:

  1. #include "leveldb/write_batch.h"
  2. ...
  3. std::string value;
  4. leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
  5. if (s.ok()) {
  6. leveldb::WriteBatch batch;
  7. batch.Delete(key1);
  8. batch.Put(key2, value);
  9. s = db->Write(leveldb::WriteOptions(), &batch);
  10. }

WriteBatch对象保存对数据库进行的一系列操作,然后在这一批次中按照顺序应用这些操作。注意:这里先进行Delete操作,然后再进行Put操作,是因为在key1key2相同的情况下不会错误的将该值丢弃。

WriteBatch类除了原子性的优势外,也可以用于通过将大量个体变动放置在同一批次中而加速批量更新。