显然,graphQL突变是按顺序逐个执行的。
来源:
在GraphQL中,突变作为序列执行。否则,这很难 检测错误,例如一次又一次地添加同一作者。
完全由GraphQL服务器实现来实现 像这样的突变。参考NodeJS实现和其他 Python和Scala的社区实现遵循这一点。
如果我理解正确,这样可以防止:
这项设计决定背后的理由是什么? 还有其他项目以不同的方式做到吗?
答案 0 :(得分:5)
实际上,GraphQL强烈鼓励请求并发。请求可以并行处理。每个请求都会串行执行该请求的单个突变,但可以同时处理多个请求。
表示突变和请求之间的区别非常重要,特别是在并发方面。
表示GraphQL不会告诉您如何在单个请求之外应用编辑,这一点也很重要。它是您的代码抽象,您决定是否使用SQL begin ... commit来阻止数据库写入或直接进行更新调用并滚动骰子。
对事务进行串行编辑处理是数据库设计中非常常见的做法,在大多数数据库语言中都可以看到一组命令。
在SQL中,突变通常被BEGIN和COMMIT括起来。 在Redis中,MULTI EXEC块提供此功能。
这主要是我所看到的。但是,只要您确保结果与路径无关,并且您可以找到保证所有ACID属性保持的方法,就可以进行无序的并行编辑处理。
有很多方法可以用多种语言来实现这一点,但我只能想到Redis中的一个示例实现。
您可以将编辑内容映射到一组简短的Lua脚本,这些脚本会检查其序列化自我的交易密钥的值,如果他们找到了匹配项,他们会在申请之前返回。否则,他们将应用编辑,并将序列化编辑附加到事务正文。
注意:如果您有依赖编辑(创建表格,将表格推入表格),您可以真正自己射击,避免连续编辑执行。
就多个请求的交易而言?我从来没有真正使用它们,这个帖子更适合那个问题。
Multi-step database transaction split across multiple HTTP requests