我通过Android应用跟踪用户在Firebase数据库上更新的计数。它现在的工作方式是,在交互时,用户的应用会查找数据库上的当前计数(使用新addListenerForSingleValueEvent()
中定义的onDataChange()
和ValueEventListener
方法并向其中添加一个,然后使用mRef.setValue()
将计数设置为此新值,其中mRef
是对数据库的引用。
我担心的问题是如果大量用户同时与数据库进行交互会发生什么; Firebase是否负责确保正确读取和递增值,或者是否存在大量重叠以及由此导致的数据丢失。
答案 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.
}
});
答案 1 :(得分:1)
如果您正在使用免费计划,Firebase数据库最多可处理100个与您的数据库的实时连接,但是当第101个用户连接到您的数据库时,数据库将停止响应并显示上次编辑的值。 Firebase非常擅长同时处理实时连接,因此它取决于您的定价计划。如果您想免费使用数据库,那么处理100个连接就没有问题,但如果您想处理更多用户,请使用他们慷慨的定价计划。