2011-11-01 4 views
8

Mam proces uzgadniania, w którym przez wątek tła, który okresowo pobiera listę identyfikatorów obiektów z zewnętrznego serwisu WWW i próbuje dodać brakujące elementy do osadzonej bazy danych RavenDb. Pętla, który wykonuje ten proces jest następujący:Czytanie z RavenDb natychmiast po napisaniu do niego zwraca niespójne dane

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

realizacja GetPageByPageId() i AddPage() są następujące:

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

Problemem jest to, że jeśli lista zawiera zduplikowane identyfikatory, po to dodaje pierwszy identyfikator i ponownie sprawdza ten identyfikator, wynik wraca jako pusty. Wygląda to tak, jakby brakowało etapu finalizacji, który rejestrowałby nowo dodany podmiot. Jeśli zapytanie o zestaw z innego wątku w późniejszym czasie, zwracana jest encja o podanym identyfikatorze. Czy ktokolwiek może zobaczyć, o co chodzi?

Dzięki,

Odpowiedz

19

Jest to wynikiem ostatecznego modelu konsystencji że Raven przyjmuje. Aktualizacje indeksów w wyniku zapisów odbywają się asynchronicznie i dlatego jest możliwe, że wykonanie odczytu wkrótce spowoduje zwrócenie nieaktualnych wyników. Możesz zmienić zapytanie dostać zakaz nieświeży wyniki tak:

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

Jest kilka innych opcji, które Ayende covers in this blog post.

+0

Dzięki za szybką odpowiedź, to był problem! – ambog36

Powiązane problemy