如何在 faunadb 中处理并发
How to handle concurrency in faunadb
我有一些连接到 faunadb 的后端 API;我能够用数据做我需要的一切,但我对并发修改有一些严重的怀疑(这可能与 faunadb 并不严格相关,但我想了解如何使用这项技术处理它)。
首先举一个例子:我想在链接的集合 (X) 中创建一个新文档 (A) (通过引用或其他字段)到另一个集合中的其他文档(B 和 C)(Y) ;为了被链接,这些文档(B 和 C)必须满足一个条件(例如字段 F =“V”)。一旦A被创建,B和C就不能被修改(否则条件将失效! ).
当然API创建文件A可以运行与API同时修改文件B[=43] =] 和 C.
疑问来了:如果在创建链接到文档 B 和 C[ 的文档 A 时会怎样? =43=],其他人将文档 B 的字段 F 更改为与“V”不同的内容?
我最终可能会将 A 链接到错误的文档,因为两个 API 都不知道对方在做什么..
我是否需要在两个 API 中都使用“执行”功能来创建原子事务?这样我就可以:
- 检查 B 和 C 是否有效,如果是,则在单个事务中创建 A
- 检查 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,检查库存中是否有足够的产品,从库存中扣除请求的数量,设置延期交货状态,并创建订单.
我有一些连接到 faunadb 的后端 API;我能够用数据做我需要的一切,但我对并发修改有一些严重的怀疑(这可能与 faunadb 并不严格相关,但我想了解如何使用这项技术处理它)。
首先举一个例子:我想在链接的集合 (X) 中创建一个新文档 (A) (通过引用或其他字段)到另一个集合中的其他文档(B 和 C)(Y) ;为了被链接,这些文档(B 和 C)必须满足一个条件(例如字段 F =“V”)。一旦A被创建,B和C就不能被修改(否则条件将失效! ). 当然API创建文件A可以运行与API同时修改文件B[=43] =] 和 C.
疑问来了:如果在创建链接到文档 B 和 C[ 的文档 A 时会怎样? =43=],其他人将文档 B 的字段 F 更改为与“V”不同的内容? 我最终可能会将 A 链接到错误的文档,因为两个 API 都不知道对方在做什么..
我是否需要在两个 API 中都使用“执行”功能来创建原子事务?这样我就可以:
- 检查 B 和 C 是否有效,如果是,则在单个事务中创建 A
- 检查 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,检查库存中是否有足够的产品,从库存中扣除请求的数量,设置延期交货状态,并创建订单.