transaction<T> method
Runs action inside a single atomic transaction. If action throws,
every write performed during the callback is rolled back.
Implementation
@override
Future<T> transaction<T>(Future<T> Function() action) async {
// Snapshot for rollback on throw.
final tablesSnapshot = <String, Map<String, Map<String, dynamic>>>{
for (final entry in _tables.entries)
entry.key: {
for (final row in entry.value.entries)
row.key: _deepCopyRow(row.value),
},
};
final queueSnapshot = List<SyncQueueEntry>.from(_queue);
final metaSnapshot = Map<String, String>.from(_meta);
try {
return await action();
} catch (_) {
_tables
..clear()
..addAll(tablesSnapshot);
_queue
..clear()
..addAll(queueSnapshot);
_meta
..clear()
..addAll(metaSnapshot);
rethrow;
}
}