在事务中,我只想在数据不存在的情况下写入数据
DocumentReference callConnectionRef1 = firestore.collection("connectedCalls").document(callChannelModel.getUid());
firestore.runTransaction(new Transaction.Function < Void > () {
@Override
public Void apply(Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot snapshot = transaction.get(callConnectionRef1);
Log.d(TAG, callChannelModel.getUid());
if (!snapshot.exists()) {
//my code
transaction.set(callConnectionRef1, model);
} else {
//do nothing
}
return null;
});
你可以在我的文档参考中找到基于uid的内容,在我的日志中我正在打印uid
所以,在uid的数据不存在的情况下,我的日志只打印一次而且我在其他地方调用了transaction.set()它会继续显示数据存在的uid的日志已经看起来我的交易仍然在运行,如果我没有&#39; t调用transaction.set()
我该如何阻止它。
答案 0 :(得分:3)
在Android上我也遇到了。事务执行5次尝试应用自身的操作,然后才调用onFailure()
函数(即使您在apply()
函数中引发异常)。
但是看起来这是预期的行为:
MAX_ATTEMPTS
默认为5。答案 1 :(得分:2)
文档中提供了一个示例,只是抛出一个异常,它将退出事务并停止执行。
db.runTransaction(new Transaction.Function<Double>() {
@Override
public Double apply(Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot snapshot = transaction.get(sfDocRef);
double newPopulation = snapshot.getDouble("population") + 1;
if (newPopulation <= 1000000) {
transaction.update(sfDocRef, "population", newPopulation);
return newPopulation;
} else {
throw new FirebaseFirestoreException("Population too high",
FirebaseFirestoreException.Code.ABORTED);
}
}
}).addOnSuccessListener(new OnSuccessListener<Double>() {
@Override
public void onSuccess(Double result) {
Log.d(TAG, "Transaction success: " + result);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Transaction failure.", e);
}
});
DocSnippets.java
答案 2 :(得分:-2)
我使用实时数据库而不是Firestore,并且它的事务具有停止功能
return Transaction.abort();