我可以针对涉及多个位置的查询运行交易吗?
在文档中,我看到例如startAt
返回firebase.database.Query
,其ref
属性类型为firebase.database.Reference
,其transaction
方法。< / p>
我可以这样做:
ref.startAt(ver).ref.transaction(transactionUpdate).then(... ?
然后交易会在多个地点运作并正确更新吗?
我要做的是从特定版本(密钥)获取所有位置,然后将它们标记为“已读”,以便写入客户端不会更新它们。为此,我需要一个事务而不是一个简单的更新。
THX!
答案 0 :(得分:1)
所有问题的答案都是“不”。
Query的ref
属性为您提供了设置查询的节点的引用。考虑一下如何构建查询。换句话说,ref.startAt(x).ref
相当于ref
。
操纵参考(导航到子项,添加查询选项等)完全独立于任何查询结果。它只是本地的,简单的路径操作,非常类似于格式化URL。
根据定义,事务只能在单个节点上运行,使用该节点的值快照进行增量更新。他们不能“在多个位置操作并正确更新它们”。这些不是SQL事务,唯一常见的是名称 - 遗憾的是,这可能令人困惑。
起始节点不必是叶节点。但是,如果您在“父”节点上启动事务,则客户端必须下载每个子项以创建整个快照,如果其中任何一个客户端修改了任何一个快照,则可能多次。
对于用户和您(数据库的所有者)来说,这肯定是一个非常缓慢,脆弱且昂贵的操作。通常,如果节点可能无限制地增长,则不建议运行事务。
我建议修改提出的策略。仅仅为了存储“读取”标记而更新“所有孩子”根本不会缩放。
例如,您可以将客户端的最后读取ID存储在单个节点中,并编写安全规则以强制不会修改ID小于此值的数据。