У меня проблема с параллельными транзакциями.
Я использую флаттер с плагином Cloud Firestore версии 0.10.0
Я получил коллекцию счетчиков с документом test. Внутри этого документа я получил поле с именем counter (тип номера).
Этот счетчик увеличивается нажатием кнопки на разных устройствах, и тогда я понимаю, что подобная транзакция имеет смысл (я прилагаю фрагмент кода, который использую).
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, это не решение проблемы, потому что если вместо счетчика мы используем массив, например, то же самое происходит.
Похоже, что транзакция была потеряна или прочитала старое значение.
Есть ли какая-нибудь лучшая идея, как обновить счетчик с нескольких устройств?