猿问

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

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。


这是一种可能性还是我没有正确理解它?


森林海
浏览 131回答 2
2回答

隔江千里

该increment操作在服务器上以原子方式执行。在他们的操作中不能保证所有客户端(甚至任何客户端)都会看到所有中间状态。保持顺序、单调递增计数器的用例更适合事务,因为在事务中,客户端根据当前值控制新值。

慕娘9325324

JavaScript 是一种单线程语言。相对于任何其他代码,每一位代码都以某种顺序执行。除了通过任何本机库外,没有线程争用,这里不是这种情况。此外,实时数据库将所有操作按照接收顺序通过单个连接进行流水线处理,因此其操作也具有一致的顺序。综上所述,我想您可能会遇到这样一种情况,即两次调用发生set()在两次调用之前once(),这意味着它们都将显示两倍的增量值。在这种情况下,您最好使用 listener withon()以便随时了解最新的值,并在看到它发生变化时对其采取行动,而不管建立它之后会发生什么。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答