graphQL多重突变事务

时间:2015-10-15 08:38:07

标签: python database node.js scala graphql

显然,graphQL突变是按顺序逐个执行的。

来源:

  

在GraphQL中,突变作为序列执行。否则,这很难   检测错误,例如一次又一次地添加同一作者。

     

完全由GraphQL服务器实现来实现   像这样的突变。参考NodeJS实现和其他   Python和Scala的社区实现遵循这一点。

如果我理解正确,这样可以防止:

  • 并行执行请求
  • 在多个请求中使用交易

这项设计决定背后的理由是什么? 还有其他项目以不同的方式做到吗?

1 个答案:

答案 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