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ı.
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.
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.
“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.”
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);
}
});
lockForUpdate() metodunu DB::transaction() bloğu DIŞINDA kullanmak (transaction yoksa lock anında düşer!).