问题描述
我们的团队已在aspnet核心应用中实现了交易中间件。在请求的开始,我们开始一个事务,然后委托给下一个中间件。如果发生任何未处理的异常,我们将回滚事务-否则我们将提交。不幸的是,这似乎在Hot Chocolate中不起作用。它似乎在内部处理异常。我们可以检查一些东西(在aspnet核心环境中)以确定是否有未处理的异常吗?
解决方法
在 V11 中,这种方法存在一些问题。 v11 中的解析器是并行执行的。因此,如果您想共享一个 db 上下文或其范围,您将遇到并发问题。
您可以在此处阅读有关 ef 和 HotChocolate 的更多信息: https://chillicream.com/docs/hotchocolate/integrations/entity-framework/
在 GraphQL 中,您实际上只需要一个变更中的事务范围。 突变只允许作为顶级字段
mutation {
updateUserName(input: {id:1233,name:"foo"}) {
errors {
message
}
user {
username
}
}
}
这样的事情无效
mutation {
updateUser(id:1233) {
name(value: "foo") {
value
}
}
}
由于只有顶级字段会产生副作用,您可以在那里创建您的事务范围。 如果你不想重复,你甚至可以为它定义一个中间件:
https://github.com/ChilliCream/graphql-workshop/blob/master/docs/5-understanding-middleware.md