Чтение из RavenDb сразу после записи в него возвращает противоречивые данные - PullRequest
7 голосов
/ 01 ноября 2011

У меня есть процесс согласования, при котором фоновый поток периодически извлекает список идентификаторов объектов из внешнего веб-сервиса и пытается добавить отсутствующие объекты во встроенную базу данных 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;
}

Проблема заключается в том, что если списокимеет повторяющиеся идентификаторы, после добавления первого идентификатора и повторной проверки этого идентификатора результат возвращается пустым.Как будто отсутствует этап завершения, который бы регистрировал вновь добавленную сущность.Если позднее я сделаю запрос к набору из другого потока, будет возвращена сущность с указанным идентификатором.Кто-нибудь может увидеть, в чем здесь проблема?

спасибо,

1 Ответ

18 голосов
/ 01 ноября 2011

Это результат возможной модели согласованности, принятой Raven.Обновления индексов в результате записи происходят асинхронно, и поэтому возможно, что выполнение чтения вскоре после этого вернет устаревшие результаты.Вы можете изменить свой запрос, чтобы получить нестандартные результаты, например:

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

Есть несколько других опций, которые Ayende рассматривает в этом сообщении в блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...