云Firestore交易丢失

时间:2019-04-29 20:41:41

标签: flutter google-cloud-firestore

我对并发事务有疑问。 我正在将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,这不是解决问题的方法,因为如果我们使用一个数组而不是一个计数器,例如会发生同样的事情。

似乎交易已丢失或已读取旧值。

关于如何从多个设备更新计数器的任何更好的主意?

0 个答案:

没有答案