Транзакция Firebase считывает значение null на пути, даже если на этом пути есть данные

Dec 22 2020

Я понимаю, что транзакции firebase иногда считывают данные как нулевые, но затем цикл запускается снова, пока значение не будет получено с сервера и зафиксировано. Однако я столкнулся с уникальной ситуацией, когда транзакция считывает нулевые данные и фиксирует значение, которое я возвращаю в случае нулевого значения. Пожалуйста, посмотрите прикрепленный код.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

В приведенном выше коде deductTransaction - это путь к данным (числу), которые я хочу обновить.

Приведенный выше код в некоторых случаях работает нормально, т.е. цикл запускается снова в случае чтения null, а иногда он запускается только один раз, считывает значение как null, даже если на этом пути были какие-то данные, а затем фиксирует 25, тем самым уничтожая исходные данные

PS: Я близок к тому, чтобы выдернуть волосы, поэтому любая помощь будет очень признательна

Ответы

1 FrankvanPuffelen Dec 22 2020 at 20:48

Когда вы запускаете транзакцию в каком-либо месте, немедленно вызывается обратный вызов / обработчик с текущим предположением клиента о значении в этом месте. Чаще всего это первоначальное предположение о текущем значении null.

Ваш обработчик должен справиться с этой ситуацией. Итак: предположим, что в этом месте нет данных, и вы хотите вычесть стоимость, что произойдет? Обычно вы либо возвращаетесь, -25либо приказываете транзакции прерваться.

В любом случае: первоначальное предположение и новое значение будут отправлены на сервер базы данных, который затем обнаружит, что первоначальное предположение было неверным, и вернет текущее значение вызывающей стороне. Затем SDK снова вызывает ваш обработчик / обратный вызов с (нет, надеюсь, правильным) наилучшим предположением для текущего значения.

Также см:

  • Обработчик транзакций базы данных Firebase в реальном времени вызывается дважды большую часть времени (со схемой вышеуказанного потока)
  • Firebase runTransaction не работает - MutableData имеет значение null
  • Понимание разрешения конфликтов в firebase
  • Почему currentData в моей транзакции Firebase всегда равен нулю?

Примечание: в настоящее время вы можете выполнять операции увеличения и уменьшения без транзакции, используя incrementоператор. Это значительно упростит ваш код и будет работать лучше, как показано в разделе Как быстро вы можете атомарно увеличить значение в базе данных Firebase Realtime? .

Для сравнения: incrementоператор принимает текущее значение, 0если в данном месте нет значения.