CodeBlanks Logo Icon CodeBlanks

Transaction yönetimi

PHP kursu · İleri seviye · Ders 20/92

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

  1. 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
  2. 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.

  3. 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();
    }

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