PHP
Transaction yönetimi
beginTransaction, commit ve rollBack ile işlem (transaction) yönetmeyi öğrenirsin.
Transaction nedir?
Birden fazla ilgili sorguyu tek bir birim olarak çalıştırmaya transaction (işlem) denir. Ya hepsi başarılı olur ya da hiçbiri uygulanmaz.
beginTransaction() işlemi başlatır; commit() değişiklikleri kalıcı yapar; rollBack() hepsini geri alır.
Bu desen para transferi gibi ya-ya-ya işlemlerde veri bütünlüğünü korur: bir hesaptan çekip diğerine yatıramazsan, para kaybolmaz.
try/catch deseni
Transaction için tipik desen: try bloğunda beginTransaction(), işlem sorguları ve commit() çağrılır; hata fırlarsa catch bloğunda rollBack() çağrılır.
PHP'de PDO hataları varsayılan olarak sessizdir; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ile hataları istisnaya çevirebilirsin.
Bu desen sayesinde bir sorgu bile başarısız olsa, tüm değişiklikler geri alınır.
Uygulama Para transferini transaction ile yap
Aşağıdaki iskelette try/beginTransaction/commit ile 'Ayşe'den 30 birim düşüp 'Ali'ye 30 birim ekle. catch bloğunda rollBack() çağır. Sonra 'Ali'nin bakiyesini SELECT ile çek ve yazdır.
Örnek çözümü göster
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec("CREATE TABLE accounts (id INTEGER PRIMARY KEY AUTOINCREMENT, owner TEXT, balance INTEGER)");
$pdo->exec("INSERT INTO accounts (owner, balance) VALUES ('Ayşe', 100)");
$pdo->exec("INSERT INTO accounts (owner, balance) VALUES ('Ali', 50)");
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 30 WHERE owner = 'Ayşe'");
$pdo->exec("UPDATE accounts SET balance = balance + 30 WHERE owner = 'Ali'");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
}
$stmt = $pdo->query("SELECT balance FROM accounts WHERE owner = 'Ali'");
echo $stmt->fetchColumn() . "\n";
Kendini test et
-
Transaction yöntemlerini eşle
- beginTransaction()
- İşlemi başlatır
- commit()
- Değişiklikleri kalıcı yapar
- rollBack()
- Değişiklikleri geri alır
- try/catch
- Hatayı yakalar
-
rollBack() ne zaman çağrılır?
- Bir hata oluştuğunda
- İşlem başarılı olduğunda
- Bağlantı açıldığında
- Sorgu hazırlandığında
Cevabı göster
Bir hata oluştuğunda — Hata durumunda rollBack() tüm değişiklikleri geri alır.
-
Hata durumunda geri al
try {
$pdo->beginTransaction();
$pdo->commit();
} catch (Exception $e) {
$pdo->____();
}
Cevabı göster
try {
$pdo->beginTransaction();
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
}
Sıradaki ders: Özet - CRUD işlemleri