在 google firestore 中使用交易的缺点

jul*_*n.a 0 transactions firebase flutter google-cloud-firestore

我正在开发 Flutter 应用程序,并且正在使用 Firebase 服务。我只想坚持使用事务,因为我更喜欢一致性而不是简单性。

await Firestore.instance.collection('user').document(id).updateData({'name': 'new name'});

await Firestore.instance.runTransaction((transaction) async {
      transaction.update(Firestore.instance.collection('user').document(id), {'name': 'new name'});
    });
Run Code Online (Sandbox Code Playgroud)

交易有任何(主要)缺点吗?例如,它们是否更贵(Firebase 计费,而不是计算)?毕竟 Firestore 数据库上的数据可能会发生更改,这将导致最多 5 次重试。

供参考:https : //firebase.google.com/docs/firestore/manage-data/transactions

“您还可以使用事务对数据进行原子更改。虽然这对于增加投票总数来说有点笨拙,但对于更复杂的更改来说这是正确的方法。”

https://codelabs.developers.google.com/codelabs/flutter-firebase/#10

Dou*_*son 6

对于您展示的特定代码示例,使用事务几乎没有优势。如果您的文档更新对文档进行了静态更改,而不考虑其现有数据,则事务没有意义。您提议的事务实际上只是更新的较慢版本,因为它必须与服务器往返两次才能进行更改。简单的更新只使用一次往返。

例如,如果您想将数据附加到一个字符串,两个客户端可能会覆盖彼此的更改,具体取决于它们各自读取文档的时间。使用事务,您可以确保每次追加都会生效,无论何时执行追加,因为面对并发,事务将使用更新的数据重试。

通常,如果可能,您应该努力在没有事务的情况下完成工作。例如,更喜欢在FieldValue.increment()事务外使用,而不是在事务内手动递增。

当您要对文档(或通常是多个文档)进行更改时,在进行最终写入之前必须考虑其字段的当前值时使用事务。这可以防止两个客户端在实际协同工作时破坏彼此的更改。

请阅读文档中有关事务的更多信息,以更好地了解它们的工作原理。它不太像 SQL 事务。