gpt4 book ai didi

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

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

我正在使用 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/

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