【问题标题】:Firebase Firestore transaction “Transaction failed all retries”Firebase Firestore 事务“事务重试失败”
【发布时间】:2019-04-26 18:57:03
【问题描述】:

当我想要获取文档时,我的所有 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
        }

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

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

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

    对于像这样失败的客户端,它必须比合理的更频繁地重试。考虑缩小您的事务范围以涵盖更少的文档,或寻找其他方法来减少争用(例如为distributed counters 概述的方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多