Firebase - 多个用户使用旧值同时更新同一对象

时间:2016-08-01 00:50:44

标签: android firebase firebase-realtime-database

我通过Android应用跟踪用户在Firebase数据库上更新的计数。它现在的工作方式是,在交互时,用户的应用会查找数据库上的当前计数(使用新addListenerForSingleValueEvent()中定义的onDataChange()ValueEventListener方法并向其中添加一个,然后使用mRef.setValue()将计数设置为此新值,其中mRef是对数据库的引用。

我担心的问题是如果大量用户同时与数据库进行交互会发生什么; Firebase是否负责确保正确读取和递增值,或者是否存在大量重叠以及由此导致的数据丢失。

2 个答案:

答案 0 :(得分:12)

使用可能因并发修改而损坏的复杂数据(例如增量计数器)时,Firebase会提供事务操作。

您为此操作提供两个参数:更新函数和可选的完成回调。 update函数将数据的当前状态作为参数,并返回您想要写入的新的所需状态。

例如,如果我们想增加特定博客帖子上的upvotes数量,我们会编写如下的事务(旧版代码):

    Firebase upvotesRef = new Firebase("https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes");
upvotesRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData currentData) {
        if(currentData.getValue() == null) {
            currentData.setValue(1);
        } else {
            currentData.setValue((Long) currentData.getValue() + 1);
        }
        return Transaction.success(currentData); //we can also abort by calling Transaction.abort()
    }
    @Override
    public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
        //This method will be called once with the results of the transaction.
    }
});

Legacy source

New firebase version source

答案 1 :(得分:1)

如果您正在使用免费计划,Firebase数据库最多可处理100个与您的数据库的实时连接,但是当第101个用户连接到您的数据库时,数据库将停止响应并显示上次编辑的值。 Firebase非常擅长同时处理实时连接,因此它取决于您的定价计划。如果您想免费使用数据库,那么处理100个连接就没有问题,但如果您想处理更多用户,请使用他们慷慨的定价计划。