首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并行执行DocumentDb存储过程

并行执行DocumentDb存储过程
EN

Stack Overflow用户
提问于 2016-04-27 01:01:51
回答 2查看 856关注 0票数 2

documentDb存储过程可以并行运行并更新同一个对象吗?documentDb会按顺序处理它们吗?

考虑下面的场景。

我有一个应用程序,当我的用户完成一项任务时,我有10000枚硬币可以送给他们。我有以下目标

代码语言:javascript
运行
复制
{
    remainingPoints: 10000
}

我有一个存储过程,它从这个对象中减去10个点,并将它们添加到用户的点中。

现在假设10个用户同时完成任务,我同时调用存储过程10次,DocDb会顺序执行它们吗?还是我必须按顺序执行存储过程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 14:03:33

当我第一次开始使用DocumentDB时,我也有类似的问题,在这里和DocumentDB产品经理的电子邮件中得到了很好的答案。引用:

存储过程..。获取数据库的独立快照,以获得事务支持。快照反映sproc开始执行时的当前状态(没有陈旧的数据)(非常一致)。 警告--由于存储过程是在快照上运行的,如果在执行过程中从外部世界传入新的写入,则仍然可以在sproc中读取陈旧的内容。 此外,存储过程将始终读取它们自己的写操作。 Sprocs是DocumentDB用于多文档事务的机制。当Sproc成功地完成执行时,将提交sproc写操作。如果抛出异常,sproc中完成的所有工作都会回滚。 因此,如果两个是同步运行的链式程序,他们将不会看到彼此的写作。 如果两个链式程序碰巧写入同一个文档(替换),那么第二个链表在尝试提交写时会因为etag不匹配而失败。

由此,我继续我的设计,确保在我的写作中使用ETags,就像朱利安建议的那样。我还会自动重试每次sproc执行3次,以处理由于并行操作和其他原因而失败的情况。实际上,我从未超过3次重试(除了我的sproc有一个bug的情况),我甚至很少得到一次重试。

从我观察到的行为来看,它将每个新的sproc执行发送到一个不同的副本,直到它用完副本,然后将它们排队等待顺序执行,所以它是并行执行和串行执行的混合体。

我通过实验学到的另一个技巧是,您最好在客户端执行纯读操作(没有写,也没有明显的聚合),而不是在重载的系统上使用sproc。我认为DocumentDB的优势在于它可以并行地满足来自不同副本的不同读取。我使用expandScriptdocumentdb-utils功能对sproc代码进行了模块化,以确保我使用完全相同的代码来进行写入验证、文档内一致性和派生字段(客户端和服务器端都可以使用node.js )。即使您主要是.NET,您也可能希望使用expandScripts以模块化的方式构建sprocs。您仍然需要在构建过程中运行node.js来预处理您的脚本,或者使用Edge.NET (运行在.NET内部的节点)来动态地运行。

票数 3
EN

Stack Overflow用户

发布于 2016-04-27 06:01:54

这将取决于您为您的收藏所选择的一致性。但是思想是,DocumentDb使用etag处理并发性,并在文档版本的快照上执行存储过程,并且只有在执行成功时才提交结果。

请参阅:https://azure.microsoft.com/en-us/documentation/articles/documentdb-faq/#develop

这个线程也可能有帮助:原子地增加Azure DocumentDB中文档中的整数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36878489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档