我对并发事务有疑问。 我正在将Flutter与Cloud Firestore插件版本0.10.0配合使用
我得到了一个名为counters的集合,其中包含一个名为test的文档。在此文档中,我有一个称为计数器(数字类型)的字段。 按下不同设备上的按钮可以增加计数器的数量,这就是当我了解到这样的事务是有道理的(我附加了我正在使用的代码段)。
DocumentReference counterRef = Firestore.instance.document("counters/test");
new FlatButton(
color: Colors.green,
child: new Text("ADD"),
onPressed: () {
Firestore.instance.runTransaction((Transaction tx) async {
DocumentSnapshot Ref = await tx.get(counterRef);
if(Ref.exists){
print("Updating counter!");
await tx.update(Ref , <String, dynamic>{
'counter': Ref.data['counter'] +1,
}).catchError((e){
print("tx update err:$e");
});
}else{
print("No document found in transaction!");
}
});
},
),
仅使用2个物理设备,同时单击两个物理设备上的按钮,计数器只会增加1倍。而且我可以在日志中看到每个设备都已调用该事务(我在控制台上看到“更新计数器”打印)
第二笔交易的结果去了哪里?一切似乎进展顺利,但计数器并未增加。
我还看到新版本的插件添加了一个FieldValue.increment,这不是解决问题的方法,因为如果我们使用一个数组而不是一个计数器,例如会发生同样的事情。
似乎交易已丢失或已读取旧值。
关于如何从多个设备更新计数器的任何更好的主意?