graphQL 多重突变交易

Posted

技术标签:

【中文标题】graphQL 多重突变交易【英文标题】:graphQL multiple mutations transaction 【发布时间】:2016-01-13 15:01:38 【问题描述】:

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

来源:

https://learngraphql.com/basics/invoking-mutations/4

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

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

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

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

这个设计决策背后的基本原理是什么? 还有其他项目做的不同吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

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

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

就多个请求的事务而言?我从来没有真正使用过它们,这个帖子更适合这个问题。

Multi-step database transaction split across multiple HTTP requests

【讨论】:

也就是说,两个请求每个包含一个mutation可以并行执行,但是当两个mutation在一个请求中批量执行时,是串行执行的? 抱歉这么晚才回复,我不太确定。我从来没有将两个突变批处理到一个请求中。如果发生这种情况,我可能会做一个新的突变来执行两个解析器,但我更喜欢并称之为。

以上是关于graphQL 多重突变交易的主要内容,如果未能解决你的问题,请参考以下文章

Graphql 突变查询不适用于 express-graphql

从另一个突变中调用 GraphQL 突变?

如何使用 GraphQL.Net 和 c# 将集合传递给 GraphQL 突变?

在graphql中突变后查询

为啥 GraphQl 说我忘记为突变发送参数 [重复]

CQRS 命令和 GraphQL 突变