Могу ли я сделать транзакцию из хранилища, которая читает из хранилища, но записывает в базу данных в реальном времени? - PullRequest
0 голосов
/ 03 ноября 2018

Из документации о пакетных записях и транзакциях в firestore, что я понимаю, и, пожалуйста, исправьте меня, если я ошибаюсь, что транзакции атомарного документа записываются после чтения, и поэтому необходимо выполнить все операции чтения до записи внутри транзакции.

Но мой вопрос, можно ли делать записи в базу данных в реальном времени вместо хранилища?

Например, если взять фрагмент кода в документации, будет ли заменено обновление (запись) пожарного хранилища на счетчик населения городских документов с установленной (записать) пожарной базой для работы /populations/counter?

// Initialize document
var cityRef = firestore.collection('cities').doc('SF');
var setCity = cityRef.set({
  name: 'San Francisco',
  state: 'CA',
  country: 'USA',
  capital: false,
  population: 860000
});

var transaction = firestore.runTransaction(t => {
  return t.get(cityRef)
    .then(doc => {
      // Add one person to the city population
      var newPopulation = doc.data().population + 1;


      // ***** DOCUMENTATION WRITE OPERATION*****
      // t.update(cityRef, {population: newPopulation});



      // ***** CODE IN QUESTION *****
      realtimeDatabase().ref('/counters/population').set(newPopulation)

    });
}).then(result => {
  console.log('Transaction success!');
}).catch(err => {
  console.log('Transaction failure:', err);
});

1 Ответ

0 голосов
/ 03 ноября 2018

При работе с данными в многопользовательской среде доступные данные могут быть повреждены одновременными изменениями, такими как добавочные счетчики. В этом случае, чтобы иметь согласованные данные, вы должны использовать операцию транзакции. В Cloud Firestore транзакции полезны, когда вы хотите обновить значение поля на основе его текущего значения. Вы можете увеличить счетчик, создав транзакцию, которая считывает текущее значение счетчика, увеличивает его и записывает новое значение в Cloud Firestore.

Если вы прочитали значение свойства в документе и не обновили его обратно в операции транзакции, это означает, что она больше не является операцией транзакции. Если вы читаете это значение и вместо его обновления вы просто устанавливаете его в другом месте, это означает, что вы выполняете операцию чтения и записи, а не обновление, где предполагается использовать операцию транзакции. Поэтому не имеет значения, записываете ли вы новое значение в базу данных Firebase в реальном времени или даже в другое место в Cloud Firestore, эту операцию нельзя назвать транзакцией.

Также помните, что у каждого продукта есть собственный механизм транзакций. Вот транзакции базы данных Firebase в реальном времени , а вот Облачные транзакции Firestore .

Но мой вопрос, можно ли делать записи в базу данных в реальном времени вместо хранилища?

Да, может, но больше не является операцией транзакции.

Будет ли заменять обновление (запись) пожарного хранилища на счетчик населения городских документов на установку / запись пожарной базы (/ populations / counter)?

Да, это будет работать, но будет считаться только операцией чтения / записи.

Если вы просто хотите прочитать число и установить его в другом месте, нет необходимости в перемещении.

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