我写了这样的交易:
db.runTransaction(new Transaction.Function<Void>() {
@Override
public Void apply(Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot documentSnapshot = transaction.get(deleteRef);
if(documentSnapshot.exists())
{
transaction.delete(deleteRef);
}
return null;
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// implement logic
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
现在,当两个客户端A和B同时运行此事务时,根据此代码,只有一个可以成功,并且将实现相应的逻辑。
但是,不幸的是,由于以下错误,该事务失败:
在交易中读取的每个文档也必须写入。
请帮助,谢谢。
答案 0 :(得分:1)
这听起来像您实际上希望事务按照指示失败(因为它处于不应进行文档更新的状态)。首先,请考虑忽略该消息,因为这会告诉您为什么事务未成功,并且您知道这不是问题。
第二,如果您不喜欢该错误消息,请尝试在不应该对先前阅读的文档进行任何更改的情况下,从事务处理程序中抛出一个新的未经检查的异常(例如RuntimeException)。您可能会在任务错误处理程序中收到一条新的错误消息,但结果将是相同的-没有对任何文档进行任何更改。
答案 1 :(得分:0)
尝试替换以下内容:
if(documentSnapshot.exists())
{
transaction.delete(deleteRef);
}
具有以下内容:
transaction.delete(deleteRef);