【问题标题】:What is the scope of WaitForNonStaleResultsAsOfNow in RavenDBRavenDB 中 WaitForNonStaleResultsAsOfNow 的范围是什么
【发布时间】:2014-06-04 15:03:05
【问题描述】:

如果我在现有 RavenDB 会话上运行以下查询:

var result = session.Query<Location>()
               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
               .Where(l => l.Name = "Home" && !l.Deleted);

RavenDB 等待哪些索引?我的假设是它等待 all 索引在查询时是最新的;但这是否意味着如果Location 上只有一个动态索引,而其他表上有 20 个索引,我们总是在等待 21 个索引更新?

或者,我是否误解了该方法的功能?

【问题讨论】:

    标签: c# indexing ravendb eventual-consistency


    【解决方案1】:

    如果您要在使用 Fiddler 查询期间观察数据库通信,或者像这样在查询中请求 RavenQueryStatistics...

    RavenQueryStatistics stats;
    var result = session.Query<Location>()
                   .Customize(x => x.WaitForNonStaleResultsAsOfNow())
                   .Statistics(out stats)
                   .Where(l => l.Name = "Home" && !l.Deleted);
    

    然后你会看到如下属性:

    • IsStale
    • 时间戳 - 查询结果过期的时间
    • IndexName - 被查询的索引
    • 索引时间戳
    • IndexEtag - 与索引中更新的最后一个文档对应的文档版本
    • 其他与分页等相关的事情

    这是 WaitFor(几个变体)用来确定是否应该满足的信息。

    所以,TL;DR 的答案是:只有一个被查询的索引。检查所有个索引会很浪费。

    所以对于 WaitForNonStaleResultsAsOfNow,它说 OK,让我们获取 DateTime.Now,然后在 IndexTimestamp >= 该日期之前不返回结果。

    这些 WaitFor- 方法在某种程度上是一种反模式 - 您不应该完全依赖它们来获得一致的结果,您可能应该(在某些情况下,但不是全部)重新设计您的 UI 或数据模型,以便您在需要一致性的地方使用按文档 ID 加载/存储(保证 ACID)。

    但是,看看它是怎么做的,你会发现使用 WaitForNonStaleResultsAsOfLastWrite 可能是一个更好的主意,它会导致 Raven 客户端记录它存储的最后一个文档 E-Tag,并等待 IndexETag纳入指数。对于“插入数据,然后在更新的网格中显示”场景尤其如此。您无需等待所有索引完成,您只需确保您刚刚插入的一个东西会出现。

    【讨论】:

    • 这是一个完美的答案;谢谢大卫。它只等待相关索引是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2011-11-11
    • 2020-10-18
    • 2017-04-22
    相关资源
    最近更新 更多