如何恢复交易?



在事务中,我只想在数据不存在时写入数据

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 日志,如果我不调用 transaction.set(( 看起来我的事务继续运行

我怎么能阻止它。

在Android上也发生在我身上。事务执行 5 次尝试应用自身,然后才调用onFailure()函数(即使您在apply()函数中抛出异常(。

但看起来这是预期的行为:

  1. 请参阅此处:https://googleapis.dev/python/firestore/latest/transaction.html
    注意MAX_ATTEMPTS默认为 5。
  2. 在此 github 问题中 https://github.com/firebase/firebase-js-sdk/issues/520 请求添加"重试次数"选项。

文档中给出了一个例子,只需抛出一个异常,它就会退出事务并停止执行。


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

最新更新