【问题标题】:Does Firebase Transactions have a built in try limitFirebase 事务是否有内置的尝试限制
【发布时间】:2021-06-22 13:31:19
【问题描述】:

我有一种情况,我错误地阻止了我的 firebase 规则写入 ref,当我运行下面的代码时,“值无法更新,请重试” 打印超过 20 倍.我现在这样做的方式是事务不断尝试直到成功,但是在我刚刚遇到的情况下,如果它不成功,事务将永远运行。

我想知道如果事务失败,是否有内置方法可以运行最大尝试次数?

func runTransaction(on userId: String) {

    self.followButton.isEnabled = false

    let followersPath = Database.database().reference()
                       .child("users")
                       .child(userId)
                       .child("followersCount")

    followersPath.runTransactionBlock({ (mutableData: MutableData) -> TransactionResult in

        var currentCount = mutableData.value as? Int ?? 0
        mutableData.value = currentCount + 1
        return TransactionResult.success(withValue: mutableData)

    }, andCompletionBlock: { (error, completion, snap) in

       if !completion || (error != nil) {

           print("The value wasn't able to update, try again")

           self.runTransaction(on: userId)
           return
       }

       print("The value updated")

       let totalFollowersCount = snap?.value as? Int ?? 0

       self.myCellWithTheUserId.followersCount =  totalFollowersCount
       
       self.followButton.isEnabled = true
    })
}

【问题讨论】:

  • self.runTransaction(on: postId) 失败时这是什么情况?它会自动再次尝试事务直到超时。
  • 就是这样,我设置它的方式没有超时,它会继续尝试。当我第一次注意到这个问题时,它一直在继续并且没有停止,因为由于不正确的规则,它永远不会成功。我不得不关闭 XCode。有内置的超时功能吗?
  • 你是说我不需要添加那行,它会继续自己尝试吗?我不知道。我以为一旦失败就可以了
  • 不。它重试;见Transactions 如果事务被拒绝,服务器将当前值返回给客户端,客户端使用更新的值再次运行事务。这种情况会一直重复,直到交易被接受或尝试次数过多。如果您需要中止交易,您可以在闭包内return TransactionResult.abort()
  • 哦,谢谢伙计!我不知道它会自己尝试。我在 5 个差异项目中有相同的代码。我必须进行一些严肃的更新。您可以将此添加为答案,以便帮助下一个人吗?我有一个快速的问题。我没有在问题中包含这个,但是如果它成功,我有一些代码可以运行,它会进入我的 else 语句中。如果我摆脱 else 语句,添加我的成功代码,如果它失败,它仍然会运行,我是否需要担心它会再次运行我的函数,还是会在后端自行尝试?基本上我不希望成功代码运行两次。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

是的,最大重试次数为about 25。如果超过,您将看到 maxretry 错误代码。

您通常不必手动重试事务;如果存在并发问题,Firebase 当然会处理这部分。

对于递增值,您应该use increment rather than a transaction。这将避免这种写争用。

【讨论】:

  • 什么时候最好使用transactionincrement?我在 SO 上看到的所有关注者计数、观看次数等示例都使用事务
  • 增量的添加是最近才出现的(大约在去年)。当它适用于您的用例时,请始终使用增量。当您需要特殊逻辑来确定要增加的数量或在服务器上的成功/中止用例中进行特殊处理时,请使用事务。
  • 好的,谢谢。实际上我以前从未听说过。我必须更多地研究它。我给了你额外的一票?
猜你喜欢
  • 2016-09-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多