Ö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: (1) **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. (2) Kaçınılmaz çakışmalar için **Titreşimli (Jittered) Üstel Geri Çekilme** ile yeniden deneme.
Mühendislik El Kitabı & Mekanizma
1. Temel Çalışma Mekanizması
Kilitlenme önleme ve çözümü çizge teorisi ve olasılıksal yeniden denemelerle çalışır: (1) Coffman'ın 4 Kuralı: Kilitlenme için Karşılıklı Dışlama, Tut ve Bekle, Kesintisizlik ve Dairesel Bekleme gerekir. (2) Dairesel Beklemeyi Kırma: Satır ID'lerini kilitlemeden önce küçükten büyüğe sıralamak ($ID_1 < ID_2 < dots$), işlemlerin kaynakları her zaman aynı yönde talep etmesini sağlar ve döngüyü matematiksel olarak yok eder. (3) Titreşimli Geri Çekilme Formülü: Kurban seçilen işlem anında denemek yerine rastgele bir süre uyur: $$t_{ ext{uyku}} = ext{rastgele}(0, min(T_{max}, T_{ ext{taban}} imes 2^{ ext{deneme}}))$$ (4) Denetleme Süresi: `deadlock_timeout = 100ms` ayarı döngülerin CPU harcamadan hızlıca tespit edilmesini sağlar.
2. Doğru Kullanım Senaryosu
Stok rezervasyon motorları, banka para transferleri, sepet kilitleme akışları ve yüksek eşzamanlı biletleme sistemleri.
3. Prodüksiyon Arıza Modları
Farklı servislerde kilitleri rastgele sırayla almak (A servisi önce kullanıcıyı sonra hesabı kilitlerken, B servisinin önce hesabı sonra kullanıcıyı kilitlemesi); açık SQL işlemi içinde kilitleri tutarken uzun süren dış HTTP API çağrıları yapmak.
4. Teşhis ve Telemetri Sinyalleri
Veritabanı loglarında `ERROR: deadlock detected` kayıtlarının patlaması; transaction rollback oranının aniden yükselmesi; sorgu gecikmelerinde kilit bekleme (`wait_event: transactionid`) artışı.
5. Önleme ve Mimari Bariyerler
`SELECT ... FOR UPDATE` çalıştırmadan önce kilitlenecek tüm ID'leri küçükten büyüğe sıralayın; işlemler içinde dış ağ çağrısı yapmayıp işlemleri çok kısa ($<50 ext{ms}$) tutun; veritabanı işlemlerini titreşimli üstel geri çekilme yapan otomatik bir retry mekanizmasıyla sarın.
6. Mimari Ödünleşimler (Trade-offs)
Deterministik kilit sıralaması dairesel kilitlenmeleri tamamen yok eder; ancak aynı tablolara dokunan tüm geliştiricilerin bu sıralama kuralına sıkı sıkıya uymasını gerektirir.
Vaka İncelemesi (TinyCTO Ö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
