firebase - runTransaction 和 set() 之间的区别

标签 firebase firebase-realtime-database dart flutter

我正在查看这个用于 Flutter (dartlang) 的 Firebase API 的演示程序,并查看了原始来源。我不是在摸索 runTransactionset() 之间的区别,也不是在摸索作者为什么使用一个而不是另一个。

Future<Null> _increment() async {
    // Increment counter in transaction.
    final TransactionResult transactionResult =
        await _counterRef.runTransaction((MutableData mutableData) async {
      mutableData.value = (mutableData.value ?? 0) + 1;
      return mutableData;
    });

    if (transactionResult.committed) {
      _messagesRef.push().set(<String, String>{
        _kTestKey: '$_kTestValue ${transactionResult.dataSnapshot.value}'
      });
    } else {
      print('Transaction not committed.');
      if (transactionResult.error != null) {
        print(transactionResult.error.message);
      }
    }
}

根据源代码中的注释 runTransaction 是:

Performs an optimistic-concurrency transactional update to the data at this Firebase Database location.

对于 set 方法,评论说:

The effect of the write will be visible immediately and the corresponding events will be triggered. Synchronization of the data to the Firebase Database servers will also be started.

有人 ELI5 有什么区别吗?为什么作者选择了两种不同的方法来写入数据库?

完整的演示代码是here

最佳答案

我无法告诉您为什么作者选择其中一个而不是另一个,但是事务和常规写入之间的区别非常明显。

顾名思义,常规写入:它将值写入您指定的位置。

在 Firebase 数据库中,您使用事务根据该位置的当前值将新值写入该位置。所以它结合了读取和写入操作。 Firebase 事务的不同寻常之处在于它们是比较和设置操作。

有关这意味着什么的更多详细信息,我建议阅读以下内容:

该链接还展示了事务与自己读写的不同之处:如果当前值自读取后未被修改,则事务只会执行写入操作。

关于firebase - runTransaction 和 set() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49912142/

相关文章:

amazon-web-services - 使用 Firebase 的 AWS ApiGateway 自定义授权

android - 从简单的 FireBase 数据库中读取

android - RxFirebase 'observeSingleValueEvent' 实现阻止它返回空子值

java - 如何解决firebase构建失败错误?

javascript - 如何在 firebase 中找到多个 child 的匹配项?

android - 读取 Firebase 数据,永远不会调用 onDataChange

ios - Firebase 快速上传多张图片

flutter - 在哪里可以为我的Android应用存储图像?

javascript - Node.js 中的套接字与 Dart 中的套接字

flutter - 从 Rest API Flutter 获取数据时显示百分比指示器