PHP (Laravel) İleri Seviye Veritabanı & Tutarlılık

Database Transactions: Pessimistic vs Optimistic Locking

İki kişinin aynı anda son kalan konser biletini veya son ürünü satın almasını engelleme kavgası.

5 Yaşındaki Çocuğa Anlatır Gibi (Analoji)

Pessimistic: Gişedeki biletçi sandalyeyi fiziksel olarak zincirler, arkadakiler sıraya girer. Optimistic: Biletin üstünde revizyon numarası yazar; kasaya ilk ulaşan alır, diğeri "stok değişti" uyarısı alır.

Teknik & Mimari Tanım

Pessimistic Lock (SELECT ... FOR UPDATE) veritabanı satırını kilitler, işlem bitene kadar diğerlerini bekletir. Optimistic Lock ise tabloda bir version/lock_version sütunu tutar; UPDATE sırasında WHERE version = X koşuluyla kontrol eder.

Mülakatta Ne Demelisin? (Kurtarıcı Altın Cevap)

“Yüksek çatışma (high contention) olan stok/bakiye işlemlerinde Pessimistic Lock (lockForUpdate()) güvenlidir ama deadlock riski taşır. Düşük çatışma olan form güncellemelerinde ise Optimistic Lock daha yüksek throughput sağlar.”

PHP (Laravel) Örnek Uygulaması
DB::transaction(function () use ($userId, $amount) {
    // Satırı kilitler, diğer transaction bekler:
    $wallet = Wallet::where('user_id', $userId)->lockForUpdate()->first();
    if ($wallet->balance >= $amount) {
        $wallet->decrement('balance', $amount);
    }
});
Mülakat Tuzağı & Adayların En Sık Yaptığı Hata:

lockForUpdate() metodunu DB::transaction() bloğu DIŞINDA kullanmak (transaction yoksa lock anında düşer!).