【问题标题】:Firebase: atomic transactions and multi-location updatesFirebase:原子事务和多位置更新
【发布时间】:2016-02-17 12:40:57
【问题描述】:

我正在尝试弄清楚如何在 Firebase 中相应地更新我的数据。

我的应用是一个社交网络。假设当访客进来时,我必须更新 user 对象和 post 中的视图计数。我还必须更新相同对象中的 updatedAt 值。

  • viewsupdatedAt 字段在 postuser 子项中都有特定的 .write 授权,因此任何人都可以修改它们,这与其他子项不同。
  • 必须使用 transaction 更新 views 子级以自动增加计数
  • 另一方面,updatedAt 孩子可以以任何方式更新,transactionsetupdate

我想限制对 Firebase 的调用次数,并通过将这些更新放在一起来使整个更新原子化。 (也是因为还有很多我这里就不一一介绍了)

问题是:

  1. transaction 更新 viewsupdatedAt 必须发生两次:在 postsusers 对象上,但访问者不能在这些不属于他的对象上写,只有可以修改viewsupdatedAt 这两个孩子。 (即使其他人没有受到影响)。
  2. 当前的 Firebase API AFAIK 中不提供多位置事务,因此这也不是原子的。
  3. 对每个子节点进行多位置更新会破坏 view 子节点的原子性,这在多用户环境中是个问题。

最后,我目前在做什么:

views 子对象上有一个 transactionupdatedAt 子对象上有一个 updatepostsusers 对象,这使得它们四个操作对于每个访问者查看的每个帖子的每个视图。很多!

这也不是原子的,除了 views 孩子,这对于时间戳字段来说不是什么大问题,但在其他用例中仍然是一个问题。

我的问题是:

对更好的实施有何建议?

【问题讨论】:

  • “文档说更新会破坏该对象上发生的所有事务。它是全局的吗?”没有。这是您更新的路径上/下的所有事务。
  • 对不起,我不清楚,通过全局 Iment :不仅是当前用户会话,还有应用程序的任何用户(我知道事务需要在更新的“路径”中取消)。我想答案显然是yes
  • 我的错误,Firebase docs 明确表示,虽然交易在同一位置被本地 set 取消,但它不会set 在其他位置取消客户。如果其他客户端访问同一位置,则本地客户端使用最新数据重试事务。
  • 如果这是您要查找的信息,请将其添加为自我回答并接受。
  • 我自己对我的问题还没有一个明确的答案,但是(我仍然需要为每个帖子视图执行四个操作),但希望我能在几周内迁移我的应用程序使用 redux 存储的业务逻辑需要重新考虑这种数据交互。

标签: firebase firebase-security


【解决方案1】:

至少,您应该能够使用 data fan-out method 调用单个 update() 来更新用户和帖子上的 updatedAt 字段。

您可能拥有的任何增量计数器仍需要单独的事务才能正确处理。

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多