Flutter: выход из транзакции Firestore, если условия не выполнены - PullRequest
0 голосов
/ 23 сентября 2019

В следующей транзакции Firestore возникает следующее исключение, если условие (someNumber <2) не выполнено: </p>

Исключение:

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. Эта переменная должна быть прочитана внутри транзакции, поскольку два пользователя могут потенциально обновить значение одновременно.

1 Ответ

1 голос
/ 23 сентября 2019

У меня тоже была эта ошибка.Что касается этого обсуждения , похоже, что это известное ограничение (хотя это обсуждение началось почти 2 года назад, похоже, ничего еще не изменилось):

Это, к сожалению, известное ограничениев клиентских SDK в это время (надеюсь, решен до GA).Клиенты используют оптимистичный параллелизм для транзакций (где нет блокировки, и вместо этого клиент говорит: «в качестве предварительного условия для моей записи убедитесь, что версия документа по-прежнему X», где X - это любая версия, которую клиент прочитал во время транзакции).В настоящее время у клиента нет возможности сказать «также убедитесь, что этот другой документ, который я не пишу, все еще является версией Y».Мы добавим эту возможность и изменим клиентские SDK, чтобы разрешить чтение документов без их изменения, но у меня нет определенного срока для этого.

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