相关疑难解决方法(0)

Firebase:在单个事务中更新多个对象

我在下面找到了一些讨论这个场景的线程.

但是仍然很难找到,如果有任何推荐的数据结构设计.我看到一个多写库firebase-multi-write,它说你在大多数情况下可能不需要这个.

但我认为我确实需要这个,我的情况是:3个用户

/users/A : {credit:20}

/users/B : {credit:3}

/users/C :  {credit:10}
Run Code Online (Sandbox Code Playgroud)

每个用户可以窃取相互学分都在同一时间,

  • B点数的抢断看起来像{21,2}
  • 来自C点数的B抢断看起来像{3,9}
  • 来自A学分的C抢断看起来像{11,20}

现在我需要为每个用户更新信用以保持这种一致性,这样每个窃取操作本质上都是原子的.

在保持Java数据完整性的同时,处理此类场景的最佳方法是什么?

java firebase

6
推荐指数
1
解决办法
3102
查看次数

如何使用Firebase存储用户和群组以进行聊天

我想使用Firebase进行聊天.我需要为每个用户显示他们所属的组列表以及每个组的所有成员.

由于Firebase的设计方式,并且为了获得可接受的性能,我认为列出包含成员列表的所有组,并为每个用户创建一个包含所有组的条目.

我的第一个问题是,这是正确的方法吗?

如果是这样,我的第二个问题是如何以原子方式添加(或删除)用户,即确保将用户添加到组中并将组添加到用户中或根本不添加(即从不仅存储在1个位置并使DB不一致)?

firebase

5
推荐指数
1
解决办法
4633
查看次数

Firebase:如何以事务方式更新多个节点?迅捷3

我正在开发一个用于清洁服务的应用程序。在此应用程序中,员工(清洁工)可以读取由多个客户(用户)完成的作业(预订)列表。

所有清洁工都可以在“用户”节点中读取所有预订。最初,当用户将预订保存在数据库中时,该键claimed:的值为 “false”,这意味着清洁工尚未声明该键。

每当清洁工想要索取列表中存在的工作时,他将必须触摸按钮,该按钮将向Firebase数据库发出请求以将key的值修改claimedtrueat路径。 /Users/UID/bookings/bookingNumber

一次只能允许一名清洁工修改claimed钥匙的价值。如果允许多个清理者修改claimed密钥的值,其他清理者最终将要求相同的工作。我们不希望这种情况发生。

此外,在清理者将claimedkey 的值修改为之后true,我们将需要再次请求路径CLeaners/UID/bookings/bookingNumber以保存他刚刚在清理者节点中声明的预订。
-根据firebase的文档,每当我们希望一次仅由一个请求修改一个资源时,就会使用事务,如果有多个并发请求试图写入同一资源,则其中一个会成功。但是使用事务的问题在于,它只能写入一条路径,而不能写入多条路径

如何确保即使有多个用户可以读取此路径 /Users/UID/bookings/bookingNumber,一次也只能更新一个用户?如果写入成功,则进一步写入第二条路径 Cleaners/UID/bookings/bookingNumber

我们需要考虑到客户端的互联网连接可能断开,用户可以退出该应用程序,或者只是手机在写入上述指定路径之间的任何时间意外关闭。

数据库结构如下

Root
  Cleaners
    UID
     bookings
       bookingNumber
         amount: “10”
         claimed: “true”


   Users
     UID
      otherID
        bookingNumber
          amount: “10”
          claimed: “true”

         bookingNumber
          amount: “50”
          claimed: “false”
Run Code Online (Sandbox Code Playgroud)

为了避免任何覆盖,我决定使用Firebase事务。我可以将单个节点作为事务写入,但是在完成处理程序中写入第二个节点不是解决方案,因为在从服务器接收响应之前,清洁程序的Internet连接可能会断开,或者应用程序可能会退出,因此,完成处理程序{(error, committed,snapshot) in....将不会被评估,并且第二次写入将不会成功。

另一种情况是:执行第一次写操作,
1.在客户端应用程序中收到响应
2. 在客户端应用程序中尚未收到响应
,用户立即退出该应用程序。在这种情况下,将永远不会执行第二次写操作,因为在完成处理程序中收到(或未收到)响应后,尚未评估任何代码,因此数据库处于不一致状态。


从Firebase文档:

事务不会在应用程序重启后持续存在

即使启用了持久性,事务也不会在应用程序重启后持久化。因此,您不能依赖脱机完成的事务提交到Firebase实时数据库。

  • 是否可以使用Swift中的Firebase事务写入Firebase数据库中的多个节点?

如果是这样,我该怎么做?我在此博客中没有看到来自Google https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html的示例 。我确实知道您可以原子地写多个节点,但是我想作为事务来写。我试图在else …

firebase swift firebase-realtime-database

2
推荐指数
1
解决办法
1464
查看次数