gpt4 book ai didi

consistency - 覆盖过去读取的文档时保证 FaunaDB 的一致性

转载 作者:行者123 更新时间:2023-12-01 12:05:53 25 4
gpt4 key购买 nike

我有一个 FaunaDB,我想将其作为文档存储进行交互。我有一个 api:

  1. 从 FaunaDB 读取整个文档
  2. 根据对 api 的输入任意改变该数据
  3. 写回变异的同时保证数据没有被变异
  4. 如果尝试写入时读取不是最新的,则出错或重试

在 Postgres 中,为了保证一致性,我会简单地使用一个 where 子句。由于 Fauna 是分布式的,我假设等价物更细微,例如,我的理解是 CosmosDB 写入惯用地发送读取的 eTag 以检查以保证一致性。

最佳答案

在 fauna 中,所有写入事务都以严格的可序列化隔离通过事务管道运行。因此,我们需要在我们的两个事务中保持所需的不变性,就是确保我们将写入与读取联系起来,以检查在我们自己的代码中四处乱窜时文档是否未更新。让 $ref 成为我们拥有神奇知识的一些 ref。让 $ts 成为我们原始读取事务期间 Select("ts", Get($ref)) 的结果。让 $expr 成为我们想要将文档更新到的任何内容。然后:

If(Equals(Select("ts", Get($ref)), $ts), Update($ref, $expr), Abort("try again"))

当然,您可能想做一些更聪明的事情:返回更新后的文档失败可能是一个更好的主意。具体如何构建取决于您,但是

{error: "ts out of date", updated: Get($ref)}

效果会很好,您只需要对生成的对象进行一些案例分析,看看您是否有文档或失败。您甚至可以花点心思将读取的实例移动到 Let 中,但运行时特性大致相同(读取在 eval 期间缓存在本地,我们不会执行两次)。

关于consistency - 覆盖过去读取的文档时保证 FaunaDB 的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57012214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com