如何在一个交易中进行多套交易?

时间:2019-02-11 22:37:59

标签: angular firebase transactions google-cloud-firestore

我正在尝试在Firebase / Angular 6应用程序中运行事务,但该事务无法正常工作。

这是我拥有的:

try {
  const transactionResult = await db.runTransaction(async trans => {

  let groupRecords: any[] = [];
  for (var i = 0; i < groupIDs.length; i++) {
    const groupDocRef = db.collection('Groups').doc(groupIDs[i]);
    const groupDoc = await trans.get(groupDocRef);
    groupRecords.push(groupDoc);
  }

  for (var i = 0; i < groupRecords.length; i++) {
    const groupData = groupRecords[i].data();
    await trans.set(groupRecords[i].ref, groupData, {merge: true});
  };

  return trans.commit();
} catch (err) {
  console.log('Error updating groups:', err);

  return Promise.reject('Error updating groups: ' + err);
}

return trans.commit();

我遇到的问题是,该事务不断重复(基于上面代码片段中省略的控制台日志),然后引发错误:引用的事务已过期或不再有效。

通常,当我进行交易时,我返回trans.set(...)的结果,并且可以正常工作。这次我不能那样做。这次,我要更新一组组。我首先进行所有获取(在第一个for循环中),然后进行所有设置(在第二个for循环中)。我不返回这些集合,因为我希望所有的for循环都能完成。完成设置后,我唯一想到的就是进行提交。因此:return trans.commit()。 <—但这似乎导致重复运行事务最终导致错误。

当一个交易发生时,如何在交易中返回适当的对象,以使交易有效(即不重复,不抛出过期/无效错误,如果出现问题则可以回滚等)。做多套?

0 个答案:

没有答案