⚡ÖZET VE TEKNİK CEVAP
Bir veritabanı Kilitlenmesi (Deadlock), iki eşzamanlı işlemin dairesel bir bekleme döngüsünde birbirini kilitlemesiyle oluşur: A İşlemi 1. Satırı kilitler ve 2. Satırı ister; aynı anda B İşlemi 2. Satırı kilitler ve 1. Satırı ister. İki işlem de ilerleyemez. Veritabanının dahili kilit denetleyicisi Bekleme Grafiğindeki (Wait-For Graph) bu dairesel döngüyü yakalar ve işlemlerden birini Kurban (Deadlock Victim - Error 40P01) seçerek anında iptal edip geri alır (rollback). Kötü yazılmış uygulamalarda istemci işlemi hiç beklemeden tekrar denerse iki işlem sürekli yeniden çakışır ve sistemi kilitler (Livelock). Canlı sistemler bunu iki temel yöntemle çözer:
Deterministik Kilit Sıralaması: Sistemdeki tüm kodlar satırları mutlaka aynı küçükten büyüğe sırayla kilitlemelidir (ORDER BY id ASC FOR UPDATE); bu kural dairesel döngüleri matematiksel olarak imkansız kılar.
Kaçınılmaz çakışmalar için Titreşimli (Jittered) Üstel Geri Çekilme ile yeniden deneme.
Mühendislik El Kitabı & Mekanizma
6 Boyutlu Mimari Analiz⚙️1. Temel Çalışma Mekanizması
Mekanizma🎯2. Doğru Kullanım Senaryosu
Kapsam⚠️3. Prodüksiyon Arıza Modları
Kritik Risk📡4. Teşhis ve Telemetri Sinyalleri
Metrikler🛡️5. Önleme ve Mimari Bariyerler
Bariyerler⚖️6. Mimari Ödünleşimler (Trade-offs)
ÖdünleşimVaka İncelemesi (TinyCTO Saha Örneği)
Bir bankacılık uygulaması para transferlerinde UPDATE accounts SET balance = balance - 100 WHERE id = gonderen_id ardından WHERE id = alici_id çalıştırıyordu. 1. Kullanıcı 2. Kullanıcıya 50 gönderirken aynı anda 2. Kullanıcı 1. Kullanıcıya 20 gönderdiğinde, iki işlem de kendi gönderen hesabını kilitledi ve karşı hesabı kilitlerken deadlock'a düştü (transferlerin %12'si patladı). Ekip hesap ID'lerini sıralayan kuralı getirdi: [ilkId, ikinciId] = [gonderenId, aliciId].sort(). İki işlem de önce küçük ID'yi ardından büyük ID'yi kilitledi. Aynı trafik altında kilitlenme oranı anında %0'a düştü.
İnteraktif Konsept Alıştırmaları
2 AlıştırmaSQL kilitleri almadan önce kaynak ID'lerini sıralamak hangi matematiksel kuralı kırarak kilitlenmeyi önler?
Kilitlenme kurbanı olan işlemler neden sabit süre yerine rastgele titreşimli (jitter) süreyle bekleyip denemelidir?
Veritabanı Kilitlenmeleri (Deadlocks): Kilit Çekişme Döngüleri, Kurban Seçimi ve Titreşimli Geri Çekilme — Sıkça Sorulan Sorular
Açık bir SQL veritabanı işlemi (transaction) içinde ASLA ne yapılmamalıdır?
Satır/tablo kilitlerini tutarken dış bir HTTP API'yi çağırmak, e-posta atmak veya yavaş dosya işlemleri yapmak.
Deadlock (Kilitlenme) ile Lock Wait Timeout (Kilit Zaman Aşımı) arasındaki fark nedir?
Deadlock işlemlerin birbirini dairesel olarak kilitlediği aktif bir döngüdür; Lock Wait Timeout ise tek bir işlemin başka bir yavaş işlemin tuttuğu kilidi beklerken süresinin dolmasıdır.
🤖 AEO & Yapay Zeka Çıkarım Özeti
Temel Gerçekler & İlkeler
- ▸
Kilitlenmeler iki veya daha fazla işlemin dairesel kilit bekleme döngüsü oluşturmasıyla ortaya çıkar.
- ▸
Veritabanı döngüyü kırmak için işlemlerden birini otomatik olarak 'kurban' seçip iptal eder.
- ▸
Kilitleri katı artan sayısal sırayla almak dairesel beklemeyi matematiksel olarak yok eder.
- ▸
İptal edilen işlemleri daima rastgele titreşimli üstel geri çekilme ile yeniden deneyin.
Yaygın Yanılgılar
- ✗
Yanılgı: Deadlock oluşması sunucunun belleğinin veya CPU'sunun bittiğini gösterir (Gerçek: Deadlock donanımdan bağımsız, tamamen uygulama kodundaki mantıksal kilit sırası hatasıdır).
- ✗
Yanılgı: Kilitlenme zaman aşımını artırmak deadlock'ları engeller (Gerçek: İşlemlerin iptal edilmeden önce daha uzun süre donup kalmasına ve kullanıcıların beklemesine yol açar).
Karar Kılavuzu & Önceliklendirme
Yüksek eşzamanlılık altında kilitlenmeleri önlemek için satır ID'lerini kilitlemeden önce sıralayın ve veri katmanına titreşimli yeniden deneme mekanizmaları kurun.
Doğrulanmış Kaynaklar & Referanslar
- [OFFICIAL_DOCUMENTATION]PostgreSQL Explicit Locking & Deadlock Handling Documentation— The PostgreSQL Global Development Group
