2011-11-01 12 views
8

Bir arka plan iş parçacığı tarafından, harici bir web hizmetinden nesne kimlikleri listesini düzenli olarak alan ve eksik varlıkları katıştırılmış bir RavenDb veritabanına eklemeye çalışan bir mutabakat sürecim var. aşağıdaki gibiRavenDb'den yazdıktan hemen sonra okunan tutarsız veriler döndürülüyor

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

GetPageByPageId() ve AddPage() uygulanması şunlardır: listesinde çift kimlikleri, varsa

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

ekler sorun bir kez bu işlemi gerçekleştiren döngü şudur ilk id ve tekrar bu kimlik için kontrol, sonuç boş olarak geri gelir. Yeni eklenen varlığı kaydedecek bir sonlandırma adımı eksik gibi. Seti daha sonra farklı bir iş parçacığından sorgularsam, bu kimliğe sahip öğe döndürülür. Sorunun ne olduğunu herkes görebilir mi? Bu Raven kabul nihai tutarlılık modelinin bir sonucudur

cevap

19

sayesinde. Yazma sonucunda indeksler için yapılan güncellemeler eşzamansız bir şekilde gerçekleşir ve bu nedenle kısa bir süre sonra yapılan okumalar eski sonuçları döndürür. Böyle olmayan bayat sonuçları almak için sorgu değiştirebilir: diğer seçenekler Ayende covers in this blog post bir çift var

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

.

+0

Hızlı yanıt için teşekkürler, bu gerçekten sorun oldu! – ambog36

İlgili konular