Firestore 如何停止事务?

Ano*_*ous 5 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;

 });
Run Code Online (Sandbox Code Playgroud)

您可以在我的文档参考中看到基于 uid 并且在我的日志中我正在打印 uid

因此,在 uid 的数据不存在的情况下,我的日志仅打印一次,我在其他地方调用 transaction.set() 它会一直显示数据已经存在的 uid 的日志 如果我不调用 transaction.set() 看起来我的事务会继续运行

我怎么能阻止它。

Mob*_*Dev 3

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


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
Run Code Online (Sandbox Code Playgroud)