事务在 Firestore 中成功,但在失败时落入



我在Firestore中运行一个事务,如下所示:

final DocumentReference deleteRef = db.collection("ABC").document("XYZ");
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);
Log.d("MyActivity", "inside documentSnapshot.exists()");
Log.d("MyActivity",deleteRef.getPath());
}
return null;
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// implement logic
Log.d("MyActivity","onSuccess");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("MyActivity","onFailure");
Log.e("MyActivity", "transaction failure", e);
}
});

客户端 A 的日志:

2019-10-21 20:

28:45.134 15866-16240/someapp D/我的活动:里面 documentSnapshot.exists((

2019-10-21 20:28:45.134 15866-16240/someapp D/MyActivity: ABC/XYZ

2019-10-21 20:28:45.488 15866-15866/someapp D/MyActivity: onSuccess

客户端 B 的日志:

2019-10-21 20:28:46.041 30293-31123/someapp D/MyActivity:里面 documentSnapshot.exists((

2019-10-21 20:28:46.041 30293-31123/someapp D/MyActivity: ABC/XYZ

2019-10-21 20:28:47.900 30293-30293/someapp D/MyActivity: 失败

2019-10-21 20:58:04.137 6537-6537/someapp E/MyActivity: 事务失败 com.google.firebase.firestore.FirebaseFirestoreException:事务重试失败。 at com.google.firebase.firestore.core.SyncEngine.lambda$transaction$0(com.google.firebase:firebase-firestore@@19.0.1:283( at com.google.firebase.firestore.core.SyncEngine$$Lambda$2.then(com.google.firebase:firebase-firestore@@19.0.1( at com.google.android.gms.tasks.zzf.run(未知来源( at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428( at java.util.concurrent.FutureTask.run(FutureTask.java:237( at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272( at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133( at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607( at com.google.firebase.firestore.util.AsyncQueue$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@19.0.1:205( at java.lang.Thread.run(Thread.java:761( 由以下原因引起:com.google.firebase.firestore.FirebaseFirestore异常:每个 还必须写入事务中读取的文档。 at com.google.firebase.firestore.core.Transaction.commit(com.google.firebase:firebase-firestore@@19.0.1:182( at com.google.firebase.firestore.core.SyncEngine.lambda$transaction$1(com.google.firebase:firebase-firestore@@19.0.1:270( at com.google.firebase.firestore.core.SyncEngine$$Lambda$1.then(com.google.firebase:firebase-firestore@@19.0.1( at com.google.android.gms.tasks.zzf.run(未知来源( at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428( at java.util.concurrent.FutureTask.run(FutureTask.java:237( at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272( at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133( at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607( at com.google.firebase.firestore.util.AsyncQueue$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@19.0.1:205( at java.lang.Thread.run(Thread.java:761(

现在,2 个客户端 A 和 B 几乎同时运行此事务。正如人们所期望的那样,如果客户端 A 进入 onSuccess,则客户端 B 进入 onFailure。

但是,出乎意料的是,两个客户端都在删除该文档。

换句话说,即使事务在客户端 B 的 onFailure 中着陆,它也会删除文档,这种情况不应该发生。

请帮助我理解这一点。

只有第一个客户端实际删除文档。 第二个客户端将看到不存在的文档。

您可能还想知道 Cloud Firestore 中的删除不会生成错误。 此外,获取文档也不会为不存在的文档生成错误。

所以实际上,使用你显示的代码,第二个客户端会看到documentSnapshot.exists()返回 false,并且事务中不会发生任何事情,因为exists()也不会产生任何错误。

如果看到客户端最终出现故障,请尝试记录异常以查看实际情况。

最新更新