【发布时间】:2018-06-21 19:08:10
【问题描述】:
我正在运行一个非常简单的 Firestore 事务,它会检查文档是否存在,如果不存在则写入它。
(用例正在注册用户名 - 如果尚未注册,则当前用户可以获取它)
这是相关 Flutter 代码的 sn-p:
DocumentReference usernameDocRef =
Firestore.instance.collection(_USERNAMES).document(username);
await Firestore.instance.runTransaction((transaction) async {
var snapshot = await transaction.get(usernameDocRef);
if (!snapshot.exists) {
transaction.set(usernameDocRef, {
_UsernamesKey.userid: _user.id,
});
}
});
这失败了,出现“事务所有重试失败”异常。
基于Firestore documentation,失败可能有两个原因:
- 事务包含写操作之后的读操作。读取操作必须始终在任何写入操作之前进行。
- 事务读取了在事务之外修改的文档。在这种情况下,事务会自动再次运行。事务被重试有限次。
我认为我不会触发其中任何一个。有什么建议吗?
【问题讨论】:
-
我提出了一个关于这个的问题:github.com/flutter/flutter/issues/18747
-
终于可以解决问题了吗?
-
交易也可能由于规则(身份验证)问题而失败,在这种情况下您应该收到
403错误。
标签: firebase transactions google-cloud-firestore flutter