簡體   English   中英

C# BulkWriteAsync,事務和結果

[英]C# BulkWriteAsync, Transactions and Results

我對使用 mongodb 比較陌生。 目前,我對 API 尤其是 C# 驅動程序越來越熟悉。 我有一些關於批量更新的理解問題。 由於 C# 驅動程序提供了 BulkWriteAsync 方法,我可以在 mongo 文檔中閱讀很多有關它的信息。 據我了解,可以將 BulkWrite 配置為在任何步驟出現錯誤時不停止。 這可以通過使用無序設置來完成。 我沒有發現的是,數據會發生什么。 如果發生錯誤,數據庫是否會回滾? 還是我必須自己使用環境? 如果出現錯誤:我可以獲取哪個步驟不成功的詳細信息嗎? 考慮一下對 100 個文檔進行更新的批量。 我可以找出哪些更新沒有成功嗎? 由於 BulkWriteResult 提供的信息很少,我不確定此操作是否真的適合我。

提前致謝

你說得對, BulkWriteResult沒有提供完整的信息集來決定要做什么。

但是,在MongoBulkWriteException<T>的情況下,您可以訪問WriteErrors屬性以獲取出錯模型的索引。 這是如何使用該屬性的簡化示例。

var models = sourceOfModels.ToArray();
for (var i = 0; i < MaxTries; i++)
    try
    {
        return await someCollection.BulkWriteAsync(models, new BulkWriteOptions { IsOrdered = false });
    }
    catch (MongoBulkWriteException e)
    {
        // reconstitute the list of models to try from the set of failed models
        models = e.WriteErrors.Select(x => models[x.Index]).ToArray();
    }

注意:上面是非常幼稚的代碼。 我的實際代碼更復雜。 上面所做的是一遍又一遍地嘗試進行寫入,在每種情況下,只使用未完成的寫入。 假設您開始編寫 1000 個ReplaceOne<T>模型,然后完成了 900 個; 第二次嘗試將嘗試剩余的 100 次,依此類推,直到重試次數用盡,或者沒有錯誤。

如果代碼不在事務中,並且發生錯誤,當然不會回滾; 你有一些成功的寫入和一些不成功的寫入。 在事務的情況下, 仍然會引發異常(MongoDB 4.2+)。 在此之前,您不會遇到異常。

最后,雖然默認是有序寫入,但當寫入彼此不相關時(例如,表示沒有依賴關系的 DDD 聚合的文檔),無序寫入非常有用。 正是這種“不相關性”也消除了對事務的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM