Firestore如何停止交易?

时间:2018-06-07 07:31:59

标签: javascript firebase google-cloud-firestore

在事务中,我只想在数据不存在的情况下写入数据

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()

我该如何阻止它。

3 个答案:

答案 0 :(得分:3)

在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中,请求添加“重试次数”选项。

答案 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();