2011-11-01 11 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

これはレイヴンが採用最終的な一貫性モデルの結果です。書き込みの結果としてのインデックスへの更新は非同期的に発生するため、直後に読み込みを実行すると失効した結果が返される可能性があります。 Ayende covers in this blog post他のオプションのカップルがあります

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

:あなたは、このような非陳腐な結果を得るためにあなたのクエリを変更することができます。

+0

迅速な対応をお寄せいただきありがとうございました。 – ambog36

関連する問題