Firebase Firestore транзакция «Транзакция не удалась, все попытки» - PullRequest
0 голосов
/ 26 апреля 2019

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

Я пытался заставить другие файлы изменить правила, чтобы они были общедоступными.Я обнаружил, что при использовании проверки, похоже, что функция get возвращает данные.

val currentUserDocument = firebaseFirestore.collection("user").document(firebaseAuth.currentUser!!.uid)
val classMemberDocument = firebaseFirestore.collection("class").document(remoteClassID).collection("member").document(firebaseAuth.currentUser!!.uid)

        firebaseFirestore.runTransaction { transaction ->
            val userSnapshot = transaction.get(currentUserDocument)

            val isInClass = userSnapshot.getBoolean("haveRemoteClass")!!
            val classID = userSnapshot.getString("remoteClassID")!!

            if (isInClass == true && classID == remoteClassID) {
                transaction.update(currentUserDocument, "haveRemoteClass", false)
                transaction.update(currentUserDocument, "remoteClassID", "")

                transaction.delete(classMemberDocument)
            } else {
                throw FirebaseFirestoreException("You aren't in this class!", FirebaseFirestoreException.Code.ABORTED)
            }

            null
        }

1 Ответ

1 голос
/ 27 апреля 2019

Как правило, это означает, что данные, которые вы используете в транзакции, вызывают много споров.

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

Для такого сбоя клиента, он должен повторять попытку чаще, чемразумноРассмотрите возможность сокращения объема транзакции, чтобы охватить меньшее количество документов, или найдите другой способ уменьшения конкуренции (например, подход, описанный для распределенных счетчиков ).

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