繁体   English   中英

写入后立即从RavenDb读取会返回不一致的数据

[英]Reading from RavenDb immediately after writing to it returns inconsistent data

我有一个协调过程,由后台线程定期从外部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的实体。 任何人都可以看到这里的问题是什么?

谢谢,

这是Raven采用的最终一致性模型的结果。 由于写入而对索引的更新是异步发生的,因此很快就会执行读取将返回过时的结果。 您可以更改查询以获得非陈旧的结果,如下所示:

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

Ayende在这篇博客文章中介绍了其他几个选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM