CodeBlanks Logo Icon CodeBlanks

Transaction

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

main.dart
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

main.dart
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ı

Soru
await db.____((txn) async {
    await txn.insert('accounts', {'id': 1, 'amount': 100});
    await txn.insert('accounts', {'id': 2, 'amount': 50});
    print('commit');
  });
Cevap
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.

İleri seviye bölümündeki tüm dersler