【问题标题】:Firebase data consistency across multiple nodes跨多个节点的 Firebase 数据一致性
【发布时间】:2015-07-08 23:38:08
【问题描述】:

根据the firebase docs,数据被展平,索引用于链接树中的不同节点:

users
  $userId
    widgets
      $widgetId
widgets
  $widgetId

在上面的例子中,如果用户创建了一个小部件,那么 widgetid 也会存储在用户节点下。

我的问题是,考虑到现在需要不止一次写入,是否有办法保证操作的一致性。

假设第一个操作是:

var newKey = fb.child('widgets').push({ name: 'widge' }).key();

然后我可以把它写到:

fb.child('users').child(auth.id).child('widgets').child(newKey).set(true);

但是如果两次写入之间出现故障或其他问题怎么办?或者,如果我有多个地方需要存储该密钥并且在这些写入之间发生故障?

目前有没有办法在 firebase 中处理这个问题?

如果没有,是否有计划在未来支持此功能?

如果是这样,有人可以提供一个具体的例子来说明如何做到这一点吗?

【问题讨论】:

  • 请参阅firebase-multi-write请务必阅读“您需要这个吗”。提示:你可能不知道。
  • @Kato 谢谢!这看起来很准 - 我会看看。关于“你需要这个”,它并不总是需要它,还能够解释和回答问题。
  • 他们是很好的问题。为了反驳,很多人会读到这篇文章,最好把它放在前面的桌子上。

标签: firebase


【解决方案1】:

查看transaction operation 并利用 onComplete 回调进行第二次编写。您可以链接交易。
Firebase 站点上提供的示例用于安全地递增计数器。

我为另一个可能对您有所帮助的问题提供了示例代码。 How to store users and groups for a chat using Firebase

【讨论】:

  • 感谢您的链接,但如果客户端手动还原数据,IMO 就是一个黑客攻击。这可能是最好的 hack,但我想听听它说 firebase 支持或不支持这一点。
  • 据我所知,不支持会自动回滚更改的传统数据库事务(多个更新组合在一起)。当前的 .transaction 只保护并发更新(更像是 dbms 的锁定特性)。
【解决方案2】:

请注意,这现在是核心 Firebase API 的一部分。详情请见this blog post

var mergedUpdate = {};
mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true;
mergedUpdate[ 'widgets/' + widgetId ] = widgetData;

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");
ref.update(mergedUpdate);

【讨论】:

  • 您能否提供一些关于仅当新数据包含两个路径时​​才会更新用户/节点中的 widgetId 的验证规则的见解?
  • 我很乐意提供帮助。这听起来像是一个单独的问题,需要具体的细节才能有所帮助。见how to askcreating an mcve
  • @Kato 目前是否可以在 firebase 事务中写入两个单独的节点?如果多个用户尝试写入同一资源并且只允许一个用户这样做,我认为您的答案将不适用。请指教。我的问题是stackoverflow.com/questions/45508007
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多