我可以进行从Firestore读取但在实时数据库上写入的Firestore事务吗?

时间:2018-11-02 22:04:40

标签: firebase firebase-realtime-database google-cloud-firestore

documentation的Firestore批量写入和事务中,我了解了什么,如果误解了,请纠正我,该事务原子文档是在读取之后写入的,因此所有读取操作必须在在事务内部写入。

但是我的问题是可以写入实时数据库而不是firestore吗?

例如,拿文档内部的摘录,是否将Firestore更新(写入)替换为城市文档人口计数器,而将Firebase设置(写入)替换为/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 :(得分:1)

在多用户环境中使用数据时,可用数据可能会因并发修改(例如增量计数器)而损坏。在这种情况下,要获得一致的数据,应使用事务操作。在Cloud Firestore中,当您要基于字段的当前值更新时,交易非常有用。您可以通过创建一个事务来增加计数器的数量,该事务读取该计数器的当前值,对其进行递增,然后将新值写回Cloud Firestore。

如果您在文档中读取了属性的值,并且没有在事务操作中更新它,则意味着它不再是事务操作。如果您读取该值而不是对其进行更新,则只需将其设置在另一个位置即可,这意味着您应该执行读取和写入操作,而进行更新,而应该使用事务操作。因此,无论您将新值写入Firebase实时数据库还是Cloud Firestore中的另一个位置都没有关系,此操作不能称为事务。

还请记住,每种产品都有其自己的交易机制。这里是Firebase realtime database transactions,这里是Cloud Firestore transactions

  

但是我的问题是可以写入实时数据库而不是firestore吗?

是的,但是现在不再是交易操作。

  

是否将Firestore更新(写入)到城市文档人口计数器,而将Firebase设置(写入)到/ populations / counter工作?

是的,它可以工作,但仅被视为读/写操作。

如果您只想读取一个数字并将其设置在其他位置,则无需进行强制制裁。