firebase - 交易可以用于收款吗?

标签 firebase transactions google-cloud-platform flutter google-cloud-firestore

我正在使用 Firestore 并尝试通过使用事务来消除 Flutter 应用中的竞争条件。

我有子集合,最多可添加 2 个文档。

竞争条件意味着可能会添加超过 2 个文档,因为客户端代码正在使用 setData。例如:

Firestore.instance.collection(‘collection').document('document').collection('subCollection’).document(subCollectionDocument2).setData({
  ‘document2’: documentName,
});

我正在尝试使用事务来确保最多添加 2 个文档。因此,如果在事务运行时集合已更改(例如新文档添加到集合),事务将失败。

但我阅读了文档,似乎事务更多地用于竞争条件,其中在文档中设置字段,而不是在子集合中添加文档。

例如,如果尝试实现:

Firestore.instance.collection(‘collection').document('document').collection('subCollection').runTransaction((transaction) async {

}),

报错:

error: The method 'runTransaction' isn't defined for the class 'CollectionReference'.

事务可以用于监视子集合的更改吗?

有人知道其他解决方案吗?

最佳答案

Can transaction be use for monitor change to subcollection?

Firestore 中的事务由所谓的 compare-and-swap operation 工作.在事务中,您从数据库中读取文档,确定其当前状态,然后基于该状态设置其新状态。当您为整个交易完成后,您将整个当前状态和新状态文档包发送到服务器。然后,服务器检查存储层中的当前状态是否仍然与您的客户端开始时的状态相匹配,如果是,它会提交您指定的新状态。

知道这一点后,唯一可能在事务中监视整个集合的方法是将该集合中的所有文档读入事务中。虽然这对于小型集合在技术上是可行的,但它可能非常低效,而且我从未见过它在实践中完成。话又说回来,对于您集合中的两个文档,在事务中简单地读取它们可能是完全可行的。


请记住,尽管交易只能确保数据的一致性,但不一定会限制恶意用户的行为。如果你想确保集合中的文档永远不会超过两个,你应该看看服务器端机制。

最简单的机制(基础架构方面)是使用 Firestore 的服务器端安全规则,但我认为这些不会限制集合中文档的数量,正如 Doug 在他对 Limit a number of documents in a subcollection in firestore rules 的回答中所解释的那样。 .

在这种情况下,最可能的解决方案是(正如 Doug 还建议的那样)使用 Cloud Functions 将文档写入子集合中。这样您就可以简单地拒绝来自客户端的直接写入,并在您的 Cloud Functions 代码中强制执行您想要的任何业务逻辑,这些代码在受信任的环境中运行。

关于firebase - 交易可以用于收款吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851742/

相关文章:

javascript - 如何在 Web 应用程序中使用 Firebase 实时数据库

ios - 请求被服务委托(delegate) (SBMainWorkspace) 拒绝

python - 不是 Django 中 @atomic() 的嵌套版本?

google-app-engine - 如何以编程方式扩展应用引擎?

在谷歌云构建中使用 git 容器进行 git commit

docker - 在 Google Cloud 上查看 Docker 上的 Tensorboard

firebase - removeAllObservers 观察者未删除

ios - 在 viewDidDisappear 上删除 Firebase authState

hibernate - Spring , hibernate 和声明式事务实现: there is no active transaction

python - SQLalchemy 数据库级锁定