graphQL 多重突变事务

graphQL multiple mutations transaction

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

来源:

In GraphQL, mutations are executed as a sequence. Otherwise, it's hard to detect errors like adding the same author again and again.

It's totally up to the GraphQL server implementation to implement mutations like this. Reference NodeJS implementation and other community implementations for Python and Scala follow this.

如果我没理解错的话,这样做可以防止:

这个设计决定背后的基本原理是什么? 是否有其他项目采用不同的方式?

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

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

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

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

在 SQL 中,突变通常包含在 BEGIN 和 COMMIT 中。 在 Redis 中,MULTI EXEC 块提供了此功能。

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

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

您可以将编辑映射到一组简短的 Lua 脚本,这些脚本检查序列化自身的交易密钥值,如果他们找到匹配项,他们会 return申请。否则,他们会应用编辑,并将序列化编辑附加到交易正文。

注意:如果您有依赖编辑(创建 table,将条目推送到 table),您真的可以搬起石头砸自己的脚避免串行编辑执行。

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