我有一个FaunaDB,我想作为文档存储进行交互。我有一个API:
在Postgres中,为了保证一致性,我只会使用where子句。由于Fauna是分布式的,因此我认为等效项更加细微,例如,我的理解是CosmosDB写入会惯用地发送读取的eTag以进行检查以确保一致性。
答案 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期间本地缓存,我们不会重复两次)。