如何在 faunadb 中处理并发

How to handle concurrency in faunadb

我有一些连接到 faunadb 的后端 API;我能够用数据做我需要的一切,但我对并发修改有一些严重的怀疑(这可能与 faunadb 并不严格相关,但我想了解如何使用这项技术处理它)。

首先举一个例子:我想在链接的集合 (X) 中创建一个新文档 (A) (通过引用或其他字段)到另一个集合中的其他文档(BC)(Y) ;为了被链接,这些文档(BC)必须满足一个条件(例如字段 F =“V”)。一旦A被创建,BC就不能被修改(否则条件将失效! ). 当然API创建文件A可以运行与API同时修改文件B[=43] =] 和 C.

疑问来了:如果在创建链接到文档 BC[ 的文档 A 时会怎样? =43=],其他人将文档 B 的字段 F 更改为与“V”不同的内容? 我最终可能会将 A 链接到错误的文档,因为两个 API 都不知道对方在做什么..

我是否需要在两个 API 中都使用“执行”功能来创建原子事务?这样我就可以:

  1. 检查 B 和 C 是否有效,如果是,则在单个事务中创建 A
  2. 检查 B 是否链接到 A,如果没有,则在单个事务中修改它

谢谢大家

Fauna 尝试呈现一致的数据视图,无论您的客户何时需要询问。 Isolation 交易效果在短时间尺度(通常小于 10 毫秒)内很重要。

Do 函数仅允许您将多个不同的 FQL 表达式组合到一个查询中。 Do.

没有条件处理方面

您当然可以在进行操作之前检查条件,所有 Fauna 查询都是原子事务:所有查询都成功或 none 成功。

安排中间查询值以执行条件逻辑确实会使 FQL 查询更加复杂,但它们绝对是可能的:

您的第一个 API 查询可能如下所示:

Let(
  {
    document_b: Get(<reference to B document>),
    document_c: Get(<reference to C document>),
    required_b: Select(["data", "required_field"], Var("document_b"),
    required_c: Select(["data", "other_required"], Var("document_c"),
    condition: And(Var("required_b"), Var("required_c")),
  },
  If(
    Var("condition"),
    Create(Collection("A"), { data: { <document A data }}),
    Abort("Cannot create A because the conditions have not been met.")
  )
)

Let 函数允许您为中间表达式组合命名值,这些表达式可以读取或写入它们需要的任何内容,以及确定需要测试哪些条件的逻辑操作。值组合后跟一个表达式,在此示例中,该表达式测试条件并且仅在满足条件时才在 A 集合中创建文档。当不满足条件时,事务将中止并显示相应的错误消息。

Let 可以根据需要嵌套 Let,只要查询适合 maximum query length of 16MB,这样您就可以在查询中嵌入大量逻辑。当单个查询的长度不够时,你可以定义可调用的UDF,它允许你存储你可以使用任意次数的业务逻辑。

查看 E-commerce tutorial 执行提交订单所需的所有处理的 UDF,检查库存中是否有足够的产品,从库存中扣除请求的数量,设置延期交货状态,并创建订单.