Откат Firestore с условными операциями отката - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь запустить эту следующую транзакцию в приложении флаттера.

var db = Firestore.instance;
var chatReference = db
  .collection('Messages')
  .document(groupChatId)
  .collection("Chats")
  .document(docId);

var newChatReference = db
  .collection('NewMessages')
  .document(groupChatId);

Firestore.instance.runTransaction((transaction) async {

  DocumentSnapshot snap;
  snap = await transaction.get(newChatReference);
  storedTS = snap.data['timestamp'];
  //'timestamp' is stored as string in the db
  //storedTS will be compared with a given string later on

  //update 'content' field (string) with new value       
  await transaction.update(
    chatReference, {
      'timestamp': DateTime.now().millisecondsSinceEpoch.toString(),
      'content': 'My updated content',
    },
  ).then((val) {

    print('updated');
  }).catchError((e) {
    print('updateErr: $e');
  });

  if (storedTS == myCondition) {
    //if true then also update this other document. If not, just ignore it. 
    //During test if it IS true, both docs are updated as expected.
    // If it is NOT true, then the first update completes, since the console 
    shows
    //updated. But in the db the value remains the same, which means it was 
    //rolled back just after being updated (or so I guess).

    await transaction.update(
      newChatReference, {
        'timestamp': DateTime.now().millisecondsSinceEpoch.toString(),
      }
    ).then((val) {

      print('newChat TS updated');
    }).catchError((e) {
      print('updateErr newChat TS: $e');
    });
  }
}).catchError((e) {
  print("rtError: $e");
});

Я получаю печать в консоли с надписью «обновлено», но в БД в коллекции ничего не меняется с первой операции обновления. Если я достану , если блок во втором обновлении, то он работает как ожидалось. Ошарашенный! Надеюсь, кто-то здесь может указать, что я делаю неправильно.

1 Ответ

0 голосов
/ 26 февраля 2020

Хорошо, после многих копаний я узнал, что если вы ПРОЧИТАЕТЕ do c в tx, вы ДОЛЖНЫ также сделать ЗАПИСЬ на этом do c. Бьет меня, почему так должно быть, но сейчас, я думаю, нам просто придется с этим жить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...