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

本文关键字:读取 返回 不一致 数据 RavenDb | 更新日期: 2023-09-27 18:12:54

我有一个协调过程,其中后台线程定期从外部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的实体。有人能看出问题在哪里吗?

谢谢,

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

这是Raven采用的最终一致性模型的结果。由于写入而对索引进行的更新是异步发生的,因此在此之后不久执行读操作可能会返回过时的结果。您可以修改您的查询以获得不过时的结果,如下所示:

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

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