2011-11-01 15 views
8

我有一個調整過程,後臺線程定期從外部Web服務檢索對象ID列表並嘗試將缺失的實體添加到嵌入的RavenDb數據庫。執行此過程中的循環是:在寫入數據後立即從RavenDb中讀取返回不一致的數據

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

GetPageByPageId()AddPage()的執行情況如下:

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; 
} 

的問題是,如果在列表中有重複的ID,一旦添加第一個id並再次檢查該id,結果返回爲空。這就好像完成步驟缺失,將註冊新添加的實體。如果稍後從不同線程查詢集合,則返回具有該給定ID的實體。任何人都可以看到這裏的問題是什麼?

謝謝,

回答

19

這是Raven採用的最終一致性模型的結果。由於寫入操作而導致對索引的更新異步發生,因此可能很快執行讀取操作將返回陳舊結果。你可以改變你的查詢來獲取這樣的非陳舊結果:

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

有一對夫婦的其他選項Ayende covers in this blog post

+0

感謝您的快速反應,這確實是問題! – ambog36

相關問題