Транзакция преуспевает в Firestore, но попадает в onFailure - PullRequest
0 голосов
/ 21 октября 2019

Я выполняю транзакцию в 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, он удаляет документ, который не должен быть регистром.

Пожалуйста, помогите мне понять это.

1 Ответ

1 голос
/ 21 октября 2019

Только первый клиент фактически удаляет документ. Второй клиент увидит несуществующий документ.

Возможно, вы также захотите узнать, что удаление в Cloud Firestore не приводит к ошибке. Кроме того, получение документов также не приводит к ошибкам для документов, которые не существуют.

Таким образом, на самом деле, с кодом, который вы показываете, второй клиент увидит, что documentSnapshot.exists() вернет false, и ничего не произойдет. в транзакции, потому что exists() также не генерирует никаких ошибок.

Если вы видите, что клиент завершается с ошибкой, попробуйте зарегистрировать исключение, чтобы увидеть, что на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...