【问题标题】:DocumentDb stored procedures and optimistic concurrencyDocumentDb 存储过程和乐观并发
【发布时间】:2016-10-06 11:40:10
【问题描述】:

我的目标是编写一个存储过程或触发器,让我可以读取替换文档,然后在一个事务中更新元数据文档。

现在我知道,如果我按顺序写入集合,这将按预期工作,但是如果我并行执行多个存储过程,我是否必须手动配置脚本来比较 etag,或者这是服务器的默认行为脚本?

在阅读了this article 中的一些示例后,我的印象是,如果 etag 在读取-替换操作过程中发生更改,事务将自动失败。 然而,在this example 中,作者将 etag 包含在 requestOptions 对象中并将其传递给 replaceDocument 方法,这与我在客户端使用 .NET SDK 所做的类似。

这些不一致让我感到困惑。所以我的问题是:对于服务器端脚本,是否有必要在 requestOptions 对象中包含 etag 以强制执行乐观并发,还是这是默认行为?

【问题讨论】:

  • 这是个好问题。我一直在我的sprocs 中使用 etags (可能是防御性的),这与我的理解相冲突,即每个存储过程都是独立运行的,读写没有机会看到不一致的视图,这让我认为它不是必要的。

标签: stored-procedures azure-cosmosdb


【解决方案1】:

每个脚本作为一个事务运行。由于快照隔离,当两个脚本更新同一个文档时,如果一个更新成功,并且在文档未更新时都从快照开始,则另一个将失败,之后另一个将无法更新文档,因为它无法读取文档的版本,如果该版本晚于其快照,则脚本将不得不退出/返回到客户端,并且客户端将不得不再次执行脚本。因为使用 etags 进行并发保护是没有帮助的。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多