Firebase web - 查询交易

时间:2017-02-16 23:34:04

标签: firebase firebase-realtime-database

我可以针对涉及多个位置的查询运行交易吗?

在文档中,我看到例如startAt返回firebase.database.Query,其ref属性类型为firebase.database.Reference,其transaction方法。< / p>

我可以这样做:

ref.startAt(ver).ref.transaction(transactionUpdate).then(... ?

然后交易会在多个地点运作并正确更新吗?

我要做的是从特定版本(密钥)获取所有位置,然后将它们标记为“已读”,以便写入客户端不会更新它们。为此,我需要一个事务而不是一个简单的更新。

THX!

1 个答案:

答案 0 :(得分:1)

所有问题的答案都是“不”。

  1. Query的ref属性为您提供了设置查询的节点的引用。考虑一下如何构建查询。换句话说,ref.startAt(x).ref相当于ref

  2. 操纵参考(导航到子项,添加查询选项等)完全独立于任何查询结果。它只是本地的,简单的路径操作,非常类似于格式化URL。

  3. 根据定义,事务只能在单个节点上运行,使用该节点的值快照进行增量更新。他们不能“在多个位置操作并正确更新它们”。这些不是SQL事务,唯一常见的是名称 - 遗憾的是,这可能令人困惑。

  4. 起始节点不必是叶节点。但是,如果您在“父”节点上启动事务,则客户端必须下载每个子项以创建整个快照,如果其中任何一个客户端修改了任何一个快照,则可能多次。
    对于用户和您(数据库的所有者)来说,这肯定是一个非常缓慢,脆弱且昂贵的操作。通常,如果节点可能无限制地增长,则不建议运行事务。

  5. 我建议修改提出的策略。仅仅为了存储“读取”标记而更新“所有孩子”根本不会缩放。

    例如,您可以将客户端的最后读取ID存储在单个节点中,并编写安全规则以强制不会修改ID小于此值的数据。