为了账号安全,请及时绑定邮箱和手机立即绑定

Firebase 原子增量如何在竞争条件下工作?

Firebase 原子增量如何在竞争条件下工作?

森林海 2023-06-09 17:30:13
Firebase 原子增量可用于更新或设置。但是他们不会在完成时返回更新的值。所以,我必须在更新或设置后立即使用 once('value') :    var submitref = firebase.database().ref('/sequence/mykey')    return submitref.set(firebase.database.ServerValue.increment(1)).then(_=>{        return submitref.once('value').then(snap=>snap.val());    });让我们假设 2 个线程正在同时执行此代码。submitref.set() 可以正常工作,因为原子增量。但是,如果它们同时完成 submitref.set() 并同时执行 submitref.once('value'),则两个线程将收到相同的递增值 +2。这是一种可能性还是我没有正确理解它?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

increment操作在服务器上以原子方式执行。在他们的操作中不能保证所有客户端(甚至任何客户端)都会看到所有中间状态。

保持顺序、单调递增计数器的用例更适合事务,因为在事务中,客户端根据当前值控制新值。


查看完整回答
反对 回复 2023-06-09
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

JavaScript 是一种单线程语言。相对于任何其他代码,每一位代码都以某种顺序执行。除了通过任何本机库外,没有线程争用,这里不是这种情况。此外,实时数据库将所有操作按照接收顺序通过单个连接进行流水线处理,因此其操作也具有一致的顺序。

综上所述,我想您可能会遇到这样一种情况,即两次调用发生set()在两次调用之前once(),这意味着它们都将显示两倍的增量值。

在这种情况下,您最好使用 listener withon()以便随时了解最新的值,并在看到它发生变化时对其采取行动,而不管建立它之后会发生什么。


查看完整回答
反对 回复 2023-06-09
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信