【问题标题】:Difference between runTransaction and set()runTransaction 和 set() 的区别
【发布时间】:2018-09-29 10:18:52
【问题描述】:

我正在查看这个用于 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 中的 cmets 是:

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

对于set 方法,cmets 说:

写入的效果将立即可见,并触发相应的事件。也将开始将数据同步到 Firebase 数据库服务器。

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

完整的演示代码是here

【问题讨论】:

    标签: firebase firebase-realtime-database dart flutter


    【解决方案1】:

    在阅读了弗兰克的回答后,我明白了为什么作者选择runTransaction() vs set()

    所以 ELI5 版本是,在这种情况下,runTransaction() 用于更新_counterRef 关联的数据库条目。我们对现有条目进行更新,具体而言,我们更新按钮按下次数的整数值。

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

    【讨论】:

      【解决方案2】:

      我不能告诉你为什么作者选择了一个而不是另一个,但是事务和常规写入之间的区别是很清楚的。

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

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

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

      该链接还显示了事务与自己读取和写入的不同之处:只有在当前值自读取后未修改时,事务才会执行写入操作。

      【讨论】:

      • 感谢您的快速回答和链接!
      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      相关资源
      最近更新 更多