2011-11-01 25 views
8

Tôi có quy trình đối chiếu trong đó một chuỗi nền định kỳ truy xuất danh sách các id đối tượng từ một dịch vụ web bên ngoài và cố thêm các thực thể còn thiếu vào cơ sở dữ liệu RavenDb được nhúng. Vòng lặp mà thực hiện quá trình này là như sau:Đọc từ RavenDb ngay lập tức sau khi ghi để trả về dữ liệu không phù hợp

foreach (var pageId in listOfPageIds) 
{ 
    if (_contentService.GetPageByPageId(pageId) == null) 
    { 
     _contentService.AddPage(pageId); 
    } 
} 

thi hành GetPageByPageId()AddPage() như sau:

public Page GetPageByPageId(string pageId) 
{ 
    using (var session = DocumentStore.OpenSession()) 
    { 
     return session.Query<Page>().FirstOrDefault(page => page.PageId == pageId); 
    } 
} 

public bool AddPage(string pageId) 
{ 
    var page = GetPageByPageId(pageId); 
    if (page != null) 
    { 
     return false; 
    } 
    using (var session = DocumentStore.OpenSession()) 
    { 
     var newPage = new Page() {PageId = pageId}; 
     session.Store(newPage); 
     session.SaveChanges(); 
    } 
    return true; 
} 

Vấn đề là rằng nếu danh sách có id trùng lặp, một khi nó thêm id đầu tiên và kiểm tra cho id đó một lần nữa, kết quả trở lại như trống. Nó giống như một bước hoàn tất bị thiếu mà sẽ đăng ký thực thể mới được thêm vào. Nếu tôi truy vấn tập hợp từ một luồng khác vào lúc sau, thực thể với id đã cho đó được trả về. Có ai có thể thấy vấn đề ở đây không?

cảm ơn,

Trả lời

19

Đây là kết quả của mô hình nhất quán cuối cùng mà Raven thông qua. Các cập nhật cho các chỉ mục là kết quả của việc ghi xảy ra không đồng bộ và do đó có thể thực hiện đọc ngay sau khi sẽ trả lại các kết quả cũ. Bạn có thể thay đổi truy vấn của mình để nhận kết quả không cũ như sau:

session.Query<Page>().Customize(x => x.WaitForNonStaleResultsAsOfNow()).FirstOrDefault(page => page.PageId == pageId) 

Có một số tùy chọn khác là Ayende covers in this blog post.

+0

Cảm ơn phản hồi nhanh, đó thực sự là vấn đề! – ambog36

Các vấn đề liên quan