覆盖过去读取的文档时,确保FaunaDB中的一致性

时间:2019-07-12 18:17:53

标签: consistency document-store faunadb

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

  1. 从FaunaDB读取整个文档
  2. 根据对api的输入任意更改数据
  3. 在确保数据未发生变异的同时将变异写回
  4. 尝试写入时读取的内容不是最新错误或尝试重试

在Postgres中,为了保证一致性,我只会使用where子句。由于Fauna是分布式的,因此我认为等效项更加细微,例如,我的理解是CosmosDB写入会惯用地发送读取的eTag以进行检查以确保一致性。

1 个答案:

答案 0 :(得分:3)

在动物群中,所有写入事务均以严格的可序列化隔离性通过事务管道运行。因此,我们需要在两个事务中保持所需的不变性,就是要确保将我们的写操作与一个读操作相关联,以检查在我们自己编写代码时是否未更新文档。让$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期间本地缓存,我们不会重复两次)。