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

时间:2019-09-23 11:15:36

标签: flutter google-cloud-firestore

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

例外情况:

  

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

交易:

_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,则事务正常工作。需要在事务内部读取此变量,因为两个用户有可能同时更新该值。

1 个答案:

答案 0 :(得分:2)

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

  

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