2011-11-01 3 views
8

주기적으로 외부 웹 서비스에서 객체 ID 목록을 검색하고 누락 된 항목을 포함 된 RavenDb 데이터베이스에 추가하려는 백그라운드 스레드가 조정 프로세스를 사용하고 있습니다. 다음RavenDb에 쓰기 직후에 일관성없는 데이터를 반환합니다.

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

GetPageByPageId()AddPage()의 구현이다 : 목록 중복 ID를 가지고있는 경우

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를 가진 엔티티가 리턴됩니다. 누구든지 문제가 무엇인지 볼 수 있습니까? 이 까마귀가 채택한 최종 일관성 모델의 결과이다

답변

19

감사합니다. 쓰기의 결과로 인덱스에 대한 업데이트가 비동기 적으로 발생하므로 곧바로 읽기를 수행하면 부실한 결과가 반환 될 수 있습니다. 이 같은 쓸모가 없지 않은 결과를 얻을 수 있도록 쿼리를 변경할 수 있습니다 : 다른 옵션 Ayende covers in this blog post의 몇 가지가있다

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

.

+0

빠른 응답 주셔서 감사합니다. 실제로 문제가되었습니다. – ambog36

관련 문제