Flutter:如果不符合条件,则退出Firestore交易

贾克斯先生

在以下Firestore事务中,如果不满足条件(someNumber <2),则会发生以下异常:

例外:

PlatformException(PlatformException(9,事务在所有重试中均失败。:在事务中读取的每个文档也必须写入该事务中。,null))

交易:

_myFunction({@required docId,}) {
  try {
  final DocumentReference docRef = Firestore.instance.collection('collection').document(docId);
  Firestore.instance.runTransaction(
    (tx) async { 
      DocumentSnapshot snapshot = await tx.get(docRef);
      var someNumber = snapshot['someNumber'] ?? 0;
        if (snapshot.exists && someNumber < 2) {
          await tx.update(
            docRef,
              {
              'someNumber': FieldValue.increment(1),
              },
            );
        } else {
          print("someNumber exceeded");
          return;
        }
      },
    );
  } catch (e) {
    print(e);
  }
}

如果someNumber小于2,则该事务正常工作。由于两个用户可能同时更新该值,因此需要在事务内部读取此变量。

基里尔·布博奇金

我也有这个错误。根据此讨论,这似乎是一个已知的局限性(尽管此讨论始于大约2年前,但似乎没有任何改变):

不幸的是,这是客户端SDK目前的已知限制(希望在GA之前已解决)。客户端使用乐观并发进行事务处理(没有锁定,而是客户端说:“作为我写的先决条件,请确保文档版本仍为X”,其中X是客户端在事务处理期间读取的任何版本)。当前,客户无法说“还要确保我没有写的其他文档仍然是版本Y”。我们将添加此功能并更改客户端SDK,以允许在不修改文档的情况下阅读文档,但我没有明确的时间表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章