【问题标题】:RavenDB: Asynchronous SaveChanges affecting later updates?RavenDB:影响以后更新的异步 SaveChanges?
【发布时间】:2011-08-13 13:33:07
【问题描述】:

作为学习 RavenDB 的一部分,我正在尝试根据我每晚下载的列表更新一组股票。

我有一个 Stock 类,其中 Id 是股票代码:

public class Stock
{
    public string Id { get; set; }
    public StockStatus Status { get; set; }
}

我正在尝试使用此算法同步列表:

  1. 更新或插入所有现在下载为“StillActive”的股票。
  2. 任何上次状态为“有效”的股票都表示它们不在更新中,需要“删除”。
  3. 所有仍为“StillActive”的股票成为新的“Active”股票。

这里是实现:

List<Stock> stocks = DownloadStocks();

using (var session = RavenContext.Store.OpenSession())
{
    foreach (Stock stock in stocks)
    {
        stock.Status = StockStatus.StillActive;
        session.Store(stock);
    }

    session.SaveChanges();

    session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:Active", "Status", StockStatus.Deleted);
    session.PatchUpdateCutoffNow("Stocks/ByStatus", "Status:StillActive", "Status", StockStatus.Active);
}

PatchUpdateCutoffNow 是一个扩展方法,它执行 UpdateByIndex 与现在的截止:

public static void PatchUpdateCutoffNow(this IDocumentSession session, string indexName, string query, string name, object val)
{
    session.Advanced.DatabaseCommands.UpdateByIndex(indexName, 
        new IndexQuery() { Query = query, Cutoff = DateTime.Now },
        new[]
        {
            new PatchRequest
            {
                Type = PatchCommandType.Set,
                Name = name,
                Value = val.ToString()
            }
        });
}

我最终删除了很多不应该删除的股票。我的猜测是 SaveChanges 是异步的,并且在 PatchUpdateCutoffNow 开始时还没有完成,所以当它们应该是“活动”时,我最终会得到一些状态为“已删除”的股票。我猜 IndexQuery 截止值不适用,因为 SaveChanges 不直接针对“Stocks/ByStatus”索引。

有没有一种方法可以使 SaveChanges 同步或其他更符合 NoSQL/RavenDB 思维方式的方法?

【问题讨论】:

    标签: c# nosql ravendb


    【解决方案1】:

    文档会立即存储,但补丁命令适用于尚未更新的索引。也许这会有所帮助,插入在SaveChanges() 和补丁之间:

    using (var s = RavenContext.Store.OpenSession()) {
        s
            .Query<Stock>("Stocks/ByStatus")
            .Customize(c => c.WaitForNonStaleResultsAsOfNow())
            .Take(0)
            .ToArray();
    }
    

    顺便说一下,DatabaseCommands 不需要 session,可以直接在 store 上调用。

    【讨论】:

    • 这似乎行得通!我不确定我看到这与 IndexQuery 的截止有什么不同。希望它现在不起作用,只是因为它在补丁运行之前增加了更多时间(尽管我放了一个 Thread.Sleep(500) 并且它仍然失败,所以我认为你的解决方案很好)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多