Transaction
- Dart kursu
- İleri seviye
- Ders 46/83
- 5 dk
Transaction ile atomik işlem öğrenirsin.
Transaction
Bir transaction (işlem), birden çok veri tabanı işlemini tek bir atomik birim olarak çalıştırır. Ya hepsi başarılı olur ya da hiçbiri. Bir hata olursa tüm işlem geri alınır (rollback); hepsi başarılı olursa kesinleşir (commit).
sqflite'ta await db.transaction((txn) async { ... }) ile bir işlem başlatırsın. Blok içinde txn.insert, txn.query gibi yöntemleri kullanırsın. Örnek: para transferi — bir hesaptan düş, diğerine ekle; birisi başarısız olursa ikisi de geri alınır.
Atomik transfer örneği
Bir banka transferi düşün: A hesabından 100 lira düş, B hesabına 100 lira ekle. Bu iki işlem bir bütündür; biri başarısız olursa diğeri de geri alınmalı. Aksi halde para kaybolur veya çoğalır.
db.transaction((txn) async { await txn.insert('accounts', {'id': 1, 'amount': 100}); await txn.insert('accounts', {'id': 2, 'amount': 50}); print('commit'); }). Her iki insert da başarılı olursa 'commit' yazılır. Biri hata verirse hiçbiri kesinleşmez. Bu derste bu deseni uygulayacağız.
Uygulama Atomik transfer
Aşağıdaki kodda main bir bank.db açıyor. transferDemo(Database db) fonksiyonunu tanımla: db.transaction((txn) async { ... }) bloğu içinde iki txn.insert('accounts', ...) çağrısı ekle (id 1 amount 100 ve id 2 amount 50) ve blok sonunda print('commit') çağır. main içinde print('Transaction: atomik transfer') satırı zaten var; transferDemo(db) çağrısını ekle.
Başlangıç kodu
import 'package:sqflite/sqflite.dart';
Future<void> transferDemo(Database db) async {
// db.transaction ile iki insert atomik yap
// başarılı olursa 'commit' yazdır
}
void main() async {
print('Transaction: atomik transfer');
final db = await openDatabase('bank.db');
await transferDemo(db);
await db.close();
}Örnek çözüm
import 'package:sqflite/sqflite.dart';
Future<void> transferDemo(Database db) async {
await db.transaction((txn) async {
await txn.insert('accounts', {'id': 1, 'amount': 100});
await txn.insert('accounts', {'id': 2, 'amount': 50});
print('commit');
});
}
void main() async {
print('Transaction: atomik transfer');
final db = await openDatabase('bank.db');
await transferDemo(db);
await db.close();
}Beklenen çıktı
Transaction: atomik transfer commit
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Transaction ne sağlar?
- Daha hızlı sorgu
- Atomiklik Doğru cevap
- Daha az bellek
- Otomatik yedekleme
Açıklama: transaction atomiklik sağlar — ya hepsi ya hiçbiri.
2 Transaction parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
db.transaction |
Atomik blok |
txn.insert |
Blok içi ekleme |
commit |
Başarılı son |
rollback |
Geri alır |
3 db.transaction bağlacı
await db.____((txn) async {
await txn.insert('accounts', {'id': 1, 'amount': 100});
await txn.insert('accounts', {'id': 2, 'amount': 50});
print('commit');
});
await db.transaction((txn) async {
await txn.insert('accounts', {'id': 1, 'amount': 100});
await txn.insert('accounts', {'id': 2, 'amount': 50});
print('commit');
});
Açıklama: db.transaction atomik bloğu başlatır.