在以下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] 删除。
我来说两句