持续创作,加速成长!这是我参与「掘金日新计划 · 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);
});
}