我要获取文件时,所有的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
}
答案 0 :(得分:0)
这通常意味着您在事务中使用的数据存在很多争用。
每次运行事务时,Firebase都会确定您在事务中使用的所有文档的当前状态,并将该状态和这些文档的新状态发送到服务器。如果在事务开始与服务器获取之间更改了您获得的文档,它将拒绝该事务并且客户端重试。
要使客户端这样失败,它必须重做的次数超出了合理范围。考虑缩小交易范围以减少文件数量,或者寻找另一种减少竞争的方法(例如为distributed counters概述的方法)。