runTransaction和set()之间的区别

时间:2018-04-19 03:15:13

标签: 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中的评论是:

  

对此Firebase数据库位置的数据执行乐观并发事务更新。

对于set方法,评论说:

  

写入的效果将立即显示,并触发相应的事件。还将启动数据与Firebase数据库服务器的同步。

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

完整的演示代码为here

2 个答案:

答案 0 :(得分:1)

我无法告诉你为什么作者选择了一个而不是另一个,但是交易和常规写作之间的区别非常清楚。

常规写入正是名称所暗示的:它将值写入您指定的位置。

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

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

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

答案 1 :(得分:0)

通过阅读弗兰克的答案后,我理解作者选择runTransaction() vs set()的原因。

因此,ELI5版本就是runTransaction()用于更新_counterRef相关联的数据库条目。我们对现有条目进行更新,具体来说,我们更新按钮按下次数的整数值。

set()方法与push()一起使用向网上添加新条目。该值是使用runTransaction()方法中更新的相同值的键值字符串,即值mutableData.valuetransactionResult.dataSnapshot.value相同。