diff --git a/fielddb/field_db.cpp b/fielddb/field_db.cpp
index f836556..a5cda44 100644
--- a/fielddb/field_db.cpp
+++ b/fielddb/field_db.cpp
@@ -382,6 +382,17 @@ void FieldDB::ReleaseSnapshot(const Snapshot *snapshot) {
     kvDB_->ReleaseSnapshot(snapshot);
 }
 
+const XSnapshot * FieldDB::GetXSnapshot() {
+    SnapshotReq req(&mutex_);
+    HandleRequest(req, WriteOptions());
+    return req.xSnapshot;
+}
+
+void FieldDB::ReleaseXSnapshot(const XSnapshot *xsnapshot) {
+    kvDB_->ReleaseSnapshot(xsnapshot->kv_snapshot);
+    indexDB_->ReleaseSnapshot(xsnapshot->index_snapshot);
+}
+
 bool FieldDB::GetProperty(const Slice &property, std::string *value) {
     return kvDB_->GetProperty(property, value) | indexDB_->GetProperty(property, value);
 }
diff --git a/fielddb/field_db.h b/fielddb/field_db.h
index 2b7f0d9..e74abfc 100644
--- a/fielddb/field_db.h
+++ b/fielddb/field_db.h
@@ -35,6 +35,7 @@ public:
     friend class iDeleteReq;
     friend class DeleteReq;
     friend class BatchReq;
+    friend class SnapshotReq;
 
     //用的时候必须FieldDB *db = new FieldDB()再open,不能像之前一样DB *db
     FieldDB() : indexDB_(nullptr), kvDB_(nullptr), metaDB_(nullptr) {};
@@ -60,6 +61,9 @@ public:
     //返回当前数据库中索引状态,用来测试,不过也可以作为一个功能?
     IndexStatus GetIndexStatus(const std::string &fieldName);
 
+    const XSnapshot* GetXSnapshot();
+    void ReleaseXSnapshot(const XSnapshot* xsnapshot);
+
     static Status OpenFieldDB(Options& options,const std::string& name,FieldDB** dbptr);
 
 private:
diff --git a/fielddb/request.cpp b/fielddb/request.cpp
index ea4987e..35fa89e 100644
--- a/fielddb/request.cpp
+++ b/fielddb/request.cpp
@@ -432,5 +432,18 @@ void BatchReq::ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
     //DB->construct_BatchReq_elapsed += DB->env_->NowMicros() - start_;
 }
 
+void SnapshotReq::Prepare(FieldDB *DB) {
+    DB->index_mu.AssertHeld();
+    for(auto [_,pair] : DB->index_) {
+        auto [status,req] = pair;
+        if(status == Creating || status == Deleting) {
+            req->PendReq(this);
+            return;
+        }
+    }
+    xSnapshot = new XSnapshot(DB->kvDB_->GetSnapshot(),DB->indexDB_->GetSnapshot());
+    done = true;
+}
+
 
 }  // namespace fielddb
\ No newline at end of file
diff --git a/fielddb/request.h b/fielddb/request.h
index 8bfc23a..d3b062e 100644
--- a/fielddb/request.h
+++ b/fielddb/request.h
@@ -1,5 +1,6 @@
 #include <deque>
 #include <string>
+#include "leveldb/db.h"
 #include "leveldb/slice.h"
 #include "leveldb/status.h"
 #include "leveldb/write_batch.h"
@@ -164,6 +165,25 @@ public:
     // std::deque<FieldArray> fa_buf;
 };
 
+class SnapshotReq;
+
+class XSnapshot {
+friend class SnapshotReq;
+public:
+    XSnapshot(const Snapshot *kv,const Snapshot *index) 
+        : kv_snapshot(kv), index_snapshot(index) {}
+
+    const leveldb::Snapshot *kv_snapshot;
+    const leveldb::Snapshot *index_snapshot;
+};
+
+class SnapshotReq : public Request {
+public:
+    SnapshotReq(port::Mutex *mu):Request(iCreateReq_t, mu) { };
+    void Prepare(FieldDB *DB);
+    XSnapshot *xSnapshot;
+};
+
 }
 
 #endif
\ No newline at end of file