我的目标是编写一个存储过程或触发器,允许我读取文档,然后在一个事务中更新元数据文档。
现在我知道如果按顺序写入集合,这将按预期工作但是如果我并行执行多个存储过程,我是否必须手动配置脚本来比较etags或者是服务器的默认行为边脚本?
在阅读this article中的一些示例后,我得到的印象是,如果etag在读取替换操作过程中发生了变化,事务将自动失败。 但是在this example中,作者在requestOptions对象中包含etag,并将其传递给replaceDocument方法,类似于我在客户端使用.NET SDK进行的操作。
这些不一致让我感到困惑。所以我的问题是:对于服务器端脚本,是否有必要在requestOptions对象中包含etag以强制执行乐观并发,还是默认行为?
答案 0 :(得分:2)
每个脚本作为一个事务运行。由于快照隔离,当两个脚本更新同一个文档时,如果一个成功更新,并且它们都在未更新文档时从快照开始,另一个将失败,之后其他人无法更新文档,因为它无法读取doc的版本,如果它的快照之后,脚本将不得不退出/返回客户端,客户端将不得不再次执行脚本。因为使用etags进行同时保护是没有用的。