2011-11-01 12 views
8

मेरे पास एक सुलझाने की प्रक्रिया है जहां पृष्ठभूमि थ्रेड द्वारा समय-समय पर बाह्य webservice से ऑब्जेक्ट आईडी की एक सूची पुनर्प्राप्त होती है और लापता इकाइयों को एक एम्बेडेड 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; 
} 

समस्या है कि अगर सूची डुप्लीकेट आईडी, है एक बार यह कहते हैं पहली आईडी और फिर उस आईडी के लिए चेक, परिणाम खाली के रूप में वापस आता है। ऐसा लगता है कि अंतिमकरण चरण गुम है जो नई जोड़ी गई इकाई को पंजीकृत करेगा। यदि मैं बाद में किसी भिन्न थ्रेड से सेट को क्वेरी करता हूं, तो उस दिए गए आईडी के साथ इकाई लौटा दी जाती है। क्या कोई देख सकता है कि समस्या क्या है?

धन्यवाद,

उत्तर

19

यह अंतिम स्थिरता मॉडल है कि रेवेन को गोद ले का एक परिणाम है। लिखने के परिणामस्वरूप इंडेक्स के अपडेट असीमित रूप से होते हैं और इसलिए यह संभव है कि जल्द ही पढ़े जाने के बाद बालों के परिणाम वापस आ जाएंगे। आप इस तरह गैर-बासी परिणाम पाने के लिए आपकी क्वेरी को बदल सकते हैं:

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

वहाँ अन्य विकल्प है कि Ayende covers in this blog post की एक जोड़ी है।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, वास्तव में यह मुद्दा था! – ambog36

संबंधित मुद्दे