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



Firebase原子增量可用于更新或设置。但它们不会在完成时返回更新后的值。因此,我必须在更新或设置后立即使用一次("值"(:

    var submitref = firebase.database().ref('/sequence/mykey')
    return submitref.set(firebase.database.ServerValue.increment(1)).then(_=>{
        return submitref.once('value').then(snap=>snap.val());
    });

假设有两个线程同时执行此代码。由于原子增量,submitref.set((将正常工作。但是,如果它们同时完成submitref.set((并同时执行submitref.eonce('value'(,则两个线程将接收相同的增量值+2。

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

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

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

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

话虽如此,我想你可能会遇到这样一种情况,对set()的两次调用发生在对once()的两次呼叫之前,这意味着它们都会显示两次递增的值。

在这种情况下,您最好总体上使用带有on()的侦听器,以便随时简单地知道最新的值,并在发现它发生变化时对其采取行动,而不管建立它后会发生什么。

最新更新