【问题标题】:Reading from RavenDb immediately after writing to it returns inconsistent data写入 RavenDb 后立即读取它会返回不一致的数据
【发布时间】:2011-12-19 16:40:15
【问题描述】:

我有一个协调过程,其中通过后台线程定期从外部 Web 服务检索对象 ID 列表并尝试将丢失的实体添加到嵌入式 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 的实体。谁能看到这里有什么问题?

谢谢,

【问题讨论】:

    标签: c# database ravendb document-database


    【解决方案1】:

    这是 Raven 采用的最终一致性模型的结果。由于写入而对索引的更新是异步发生的,因此不久之后执行读取可能会返回陈旧的结果。您可以更改您的查询以获得这样的非陈旧结果:

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

    Ayende covers in this blog post 还有其他几个选项。

    【讨论】:

    • 感谢您的快速响应,这确实是问题所在!
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-06-03
    • 2019-02-18
    • 2017-05-29
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多