[官文翻译]Futter超快数据库Isar - 概念 - 事务

278 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情


Isar:用于 Futter 可跨平台的超快数据库

官方文档:Home | Isar Database

pub:isar | Dart Package (flutter-io.cn)

本文翻译自:Transactions | Isar Database

译时版本:isar: 3.0.2


事务

在 Isar 中,事务在单个处理单元中绑定了多个数据库操作。 绝大多数使用 Isar 的交互都隐式使用事务。 Isar 中的读写访问遵循 ACID 。 错误发生时,事务会自动回滚。

显式事务

使用显式事务,你可以获得数据库一致的快照。你应该尝试减少事务活跃的时间。 在事务中禁止网络调用或其它长时间的操作。

事务(尤其是写事务)肯定会有成本,你应该总是尝试将在连续的操作分组到单个事务中。

事务可以是同步或异步的。同步事务中,你会只使用同步操作。异步事务中只使用异步操作。

读写
同步.txnSync().writeTxnSync()
异步.txn().writeTxn()

读事务

显式的读事务是可选的,但是它们允许你进行原子读操作并基于和数据库一致的状态。 Isar 的内部总会对所有读操作使用隐式读事务。

异步读事务可以和其它的读写事务并行运行。很酷,对吧?

写事务

不像读操作,Isar 中的写操作总是需要包装在显式事务中。

当一个写事务成功完成时,它会自动提交,然后所有的改动都会写到磁盘。 如果发生了错误,事务会被丢弃,然后所有的改动也都会被丢弃。 事务是【所有或者没有】:即要么事务中所有的写操作都成功,要么所有的处理都无效。 这能帮助保证数据的一致性。

当数据库操作失败时,事务会被丢失并且不会再被使用,即使在 Dart 中捕捉了错误。

@Collection()
class Contact {
  @Id()
  int? id;

  late String name;
}

// 好的示例
await isar.writeTxn((isar) async {
  for (var contact in getContacts()) {
    isar.contacts.put(contact);
  }
});

// 不好的示例: 在事务内部移动循环
for (var contact in getContacts()) {
  await isar.writeTxn((isar) async {
    isar.contacts.put(contact);
  });
}