【问题标题】:GraphQL mutation operation in single transaction单个事务中的 GraphQL 变异操作
【发布时间】:2017-05-05 10:14:13
【问题描述】:

我想提供一个 GraphQL 服务,该服务在单个事务中运行整个突变操作(全部或全部更改)。

顶级字段在单个事务中连续处理并相应地更改数据库。只有在执行过程中没有错误时,才应将更改提交到数据库,否则应全部回滚。

现在我有两个问题:

  1. 根据 GraphQL 规范,顶级字段的串行执行意味着每个顶级字段将填充一个反映其修改后状态的值,然后才知道后面的字段是否会导致错误。当更高的顶级字段导致回滚事务的错误时,这是​​否不是该字段的实际值?

  2. 如果顶级字段的突变失败,则执行以下顶级字段没有意义,因为事务可能处于阻止进一步处理的状态,并且无论如何都将回滚所有更改。根据 GraphQL 语义,是否可以跳过这些字段的执行(返回 null 并且可能返回错误列表的条目)?

【问题讨论】:

  • 这一切都取决于你的后端实现,它与 GraphQL 无关。 GraphQL 只是你如何与后端交互的接口。
  • 是的,好的,但这也是最佳实践/API 用户期望的问题。

标签: graphql


【解决方案1】:

恐怕您误解了 GraphQL 规范的那一部分。如果我理解您的问题,您将事务的数据库写入/更新操作视为单独的突变。

GraphQL 有一个变异根对象,它可以有一个或多个顶级字段。这些顶级字段是单个突变。如果我们想要一个具有事务行为的服务,我们将把它实现为一个单一的突变。后端实现必须处理如何确保事务行为。

规范中让您感到困惑的部分涉及当存在多个突变顶级字段(选择集)时会发生什么。每个突变都是独立的。

【讨论】:

  • 我是这样解释规范的:GraphQL 请求中有一个 GraphQL 操作,这是一个突变。突变会连续修改顶级字段(通过解析字段的副作用在服务器上实现)。现在,我想将所有这些顶级字段修改放在一个事务中。问题是,可以这么说,是否可以解释规范,以便一旦顶级字段出现错误,解析顶级字段的副作用就不会执行任何工作?
  • 不,规范不能以那种方式解释。 GraphQL 与事务没有任何关系。它只是使用您选择的存储(持久或非持久)在场景后面存储的数据的接口。交易必须经过 GraphQL 层。
猜你喜欢
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 2017-03-18
  • 2015-11-08
  • 2018-03-18
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多