5

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

来源 :

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

实现这样的突变完全取决于 GraphQL 服务器实现。参考 NodeJS 实现以及 Python 和 Scala 的其他社区实现遵循此。

如果我理解正确,这会阻止:

  • 并行执行请求
  • 在多个请求中使用事务

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

4

1 回答 1

6

实际上,GraphQL 非常鼓励请求并发。请求可以并行处理。每个请求串行执行该请求的各个突变,但可以同时处理多个请求。

指出突变和请求之间的区别很重要,尤其是在并发方面。

同样重要的是要指出 GraphQL 不会告诉您如何在单个请求之外应用编辑。这是您的代码抽象,您决定是使用 SQL begin...commit 来阻止数据库写入,还是直接进行更新调用并掷骰子。

对事务进行串行编辑处理是数据库设计中非常常见的做法,在大多数数据库语言中都可以看到一组用于此目的的命令。

在 SQL 中,突变通常用 BEGIN 和 COMMIT 括起来。在 Redis 中,一个 MULTI EXEC 块提供了这个功能。

这主要是我所看到的。然而,无序的并行编辑处理当然是可能的,只要您确保结果是路径独立的,并且您可以找到一种方法来保证所有 ACID 属性都成立。

有许多语言可以做到这一点,但我只能想到一个在 Redis 中实现的示例。

您可以将编辑映射到一组简短的 Lua 脚本,这些脚本会检查其序列化自身的事务密钥的值,如果他们找到匹配项,他们会在申请之前返回。否则,他们将应用编辑,并将序列化的编辑附加到事务主体。

注意:如果您有相关的编辑(创建表格,将条目推送到表格),您真的可以避免连续编辑执行。

至于多个请求的交易?我从来没有真正使用过它们,这个线程更适合这个问题。

跨多个 HTTP 请求拆分的多步数据库事务

于 2016-04-04T07:19:50.750 回答