在以下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,则事务正常工作。需要在事务内部读取此变量,因为两个用户有可能同时更新该值。
答案 0 :(得分:2)
我也有此错误。根据{{3}},这似乎是一个已知的限制(尽管此讨论始于大约2年前,但似乎没有任何改变):
很遗憾,这是客户端SDK目前的已知限制(希望在GA之前已解决)。客户端使用乐观并发进行事务处理(没有锁定,而客户端说“作为我写的先决条件,请确保文档版本仍为X”,其中X是客户端在事务处理期间读取的任何版本)。当前,客户无法说“还要确保我没有写的其他文档仍然是版本Y”。我们将添加此功能并更改客户端SDK,以允许在不修改文档的情况下阅读文档,但是我没有明确的时间表。