【问题标题】:runTransaction in Firestore在 Firestore 中运行事务
【发布时间】:2021-09-28 06:00:47
【问题描述】:

我正在开发一个使用 Firestore 存储用户数据的应用程序。

据我们所知,写入 Firestore 文档的数据不是实时的,当写入频率较高时会导致问题。

所以我打算在 Firestore 中使用 runTransaction 功能。
根据here 给出的官方文档,似乎使用runTransaction 将有助于处理这种并发写入。

以下是官方文档中给出的示例的修改版本:

// Initialize document
const studentRef = db.collection('Student').doc('stud1');
await studentRef.set({
  name: 'New Name',
  id: 'stud11X',
  present: false,
});
UpdateStudentData: async function () {
  try {
    await db.runTransaction(async (t) => {
      const doc = await t.get(studentRef);
      const isPresent = doc.data().present;
      t.update(studentRef, {population: true});
    });

    console.log('Transaction success!');
  } catch (e) {
    console.log('Transaction failure:', e);
  }
}

我的问题是,例如,如果我们尝试在数据已经在进行中但尚未提交时更新数据,const isPresent = doc.data().present; 的输出是什么?
这是否提供尚未提交的最新更新?还是给出之前提交的数据?

感谢您的帮助。

谢谢

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

    您将在事务中获得的数据是数据库中的最新数据。那些保存在客户端并且未提交到数据库的将不会在事务中。事务确保每个路径只能完成一次写入,因此如果有一个从客户端将数据提交到数据库的过程,您的事务将自动重试,直到它是下一个写入数据库的。很难判断您的交易还是来自另一台设备的交易将是第一笔交易。这就是我们进行交易的原因。对他们来说应该没关系。

    【讨论】:

    • 感谢您提供详细信息。如果我们使用服务器端 SDK,我们真的需要runTransaction。根据文档,它使用悲观锁定,并且任何时候都不应该有任何并行写入对吧?
    • 没错。这就像一个队列。一次只允许一次写入。
    • 好的,谢谢。也许如果我们使用服务器端 SDK,事务可能没有多大帮助。对吗?
    • 当您需要确保一次只发生一次写入时,您应该始终使用它们。例如,当您想计算某物或计算总和时。即使您在服务器或云函数上运行代码,触发器也可能被并行触发,并且会使没有事务的代码计算数据错误。
    • 感谢您的明确解释。它确实帮助我解决了我在 Firestore 中面临的并发写入问题。感谢您的帮助。
    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2018-05-11
    相关资源
    最近更新 更多