Могут ли проводиться транзакции в магазине огня? - PullRequest
1 голос
/ 19 марта 2019

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

В настоящее время я обновляю коллекцию следующим образом:

let query;
query = db.collection('focuses');
query = query.where('userId', '==', auth.currentUser.uid);
query = query.where('active', '==', true);

query.get().then(snapshot => {
  const batch = db.batch();

  snapshot.forEach(doc => {
    batch.update(
      db.collection('focuses').doc(doc.id),
      { 
        active: false, 
        working: true,
        time: doc.data().workPeriod * 60,
      }
    );
  });

  batch.commit().then(() => {
    auth.signOut().catch(error => {
      console.error(error);
    });
  }).catch(error => {
    console.error(error);
  });
});

Это работает, нодоступ к полю workPeriod осуществляется вне транзакции, поэтому я понимаю, что он может быть уязвим для одновременного доступа.

Так можно ли выполнять транзакцию для каждого пакетного обновления?Если это не так, то является ли лучшим способом собрать каждый Promise из серии транзакций и затем использовать Promise.all для настройки обратного вызова, который будет вызываться после завершения серии транзакций?

1 Ответ

0 голосов
/ 19 марта 2019

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

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