Я выполняю транзакцию в 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 / MyActivity: внутри documentSnapshot.exists ()
2019-10-21 20: 28: 45.134 15866-16240 / someapp D / MyActivity: ABC / XYZ
2019-10-2120: 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: onFailure
2019-10-21 20: 58: 04.137 6537-6537 / someapp E / MyActivity: сбой транзакции com.google.firebase. firestore.FirebaseFirestoreException: транзакция не удалась все повторные попытки. на com.google.firebase.firestore.core.SyncEngine.lambda $ транзакция $ 0 (com.google.firebase: firebase-firestore @@ 19.0.1: 283) на com.google.firebase.firestore.core.SyncEngine $$ Lambda$ 2.then (com.google.firebase: firebase-firestore @@ 19.0.1) на com.google.android.gms.tasks.zzf.run (неизвестный источник) на java.util.concurrent.Executors $ RunnableAdapter.call (Исполнители.runWorker (ThreadPoolExecutor.java:1133) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:607) на com.google.firebase.firestore.util.AsyncQueue $ DelayedStartFactory.fireb: firebase-firestore @@ 19.0.1: 205) на java.lang.Thread.run (Thread.java:761) Причина: com.google.firebase.firestore.FirebaseFirestoreException: каждый документ, прочитанный в транзакции, также должен быть написан,на com.google.firebase.firestore.core.Transaction.commit (com.google.firebase: firebase-firestore @@ 19.0.1: 182) на com.google.firebase.firestore.core.SyncEngine.lambda $ транзакция $ 1 (com.google.firebase: firebase-firestore @@ 19.0.1: 270) на com.google.firebase.firestore.core.SyncEngine $$ Lambda $ 1.then (com.google.firebase: firebase-firestore @@ 19.0.1) на com.google.android.gms.tasks.zzf.run (неизвестный источник) на java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:428) на java.util.concurrent.FutureTask.run (FutureTask).java: 237) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:272) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecrent.conv.jpg): javaWorker.run (ThreadPoolExecutor.java:607) в com.google.firebase.firestore.util.AsyncQueue $ DelayedStartFactory.run (com.google.firebase: firebase-firestore @@ 19.0.1: 205) в java.lang.Thread.run (Thread.java:761)
N2, клиенты A и B находятся рядом, одновременно выполняя эту транзакцию. Как и следовало ожидать, если клиент A попадает в onSuccess, клиент B попадает в onFailure.
Но неожиданно оба клиента удаляют документ.
Другими словами, даже еслитранзакция попадает в onFailure для клиента B, он удаляет документ, который не должен быть регистром.
Пожалуйста, помогите мне понять это.