Firebase Firestore事务“所有重试都失败了”

时间:2019-04-26 18:57:03

标签: firebase google-cloud-firestore

我要获取文件时,所有的firestore交易都失败。

我尝试让其他文件将规则更改为公开。我发现当我使用if检查时,好像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 个答案:

答案 0 :(得分:0)

这通常意味着您在事务中使用的数据存在很多争用。

每次运行事务时,Firebase都会确定您在事务中使用的所有文档的当前状态,并将该状态和这些文档的新状态发送到服务器。如果在事务开始与服务器获取之间更改了您获得的文档,它将拒绝该事务并且客户端重试。

要使客户端这样失败,它必须重做的次数超出了合理范围。考虑缩小交易范围以减少文件数量,或者寻找另一种减少竞争的方法(例如为distributed counters概述的方法)。