MSSQL Server’da Deadlock Nedir

Veritabanı yönetiminde performans denilince akla genellikle indeksleme ve sorgu optimizasyonu gelir. Ancak ölçeklenebilir bir sistemin en büyük sessiz düşmanlarından biri Deadlock (Ölümcül Kilitlenme) yapısıdır. SQL Server gibi çok kullanıcılı sistemlerde, verinin tutarlılığını korumak için kullanılan kilitleme mekanizmalarının bazen bir çıkmaza girmesi kaçınılmazdır.

En basit tabiriyle Deadlock; iki veya daha fazla işlemin (process), birbirlerinin üzerinde kilitli tuttuğu kaynakları beklemesi durumudur. Bu bir “karşılıklı bekleyiş” senaryosudur ve dışarıdan bir müdahale (SQL Server Motoru tarafından) gelmediği sürece sonsuza kadar sürebilir.

Klasik Bir Senaryo:

  1. İşlem A: “Tablo 1″i kilitler ve “Tablo 2″ye erişmek ister.
  2. İşlem B: “Tablo 2″yi kilitler ve “Tablo 1″e erişmek ister.

Bu durumda İşlem A, İşlem B’nin elindeki kilidi bırakmasını beklerken; İşlem B de İşlem A’nın kilidi bırakmasını bekler. Sonuç: Tam bir kilitlenme.

SQL Server, bu çıkmazı tespit etmek için arka planda Deadlock Monitor adlı bir thread çalıştırır. Her 5 saniyede bir (veya kilitlenme yoğunluğuna göre daha sık) sistemi tarar. Bir döngü tespit ettiğinde:

  • Kurban Seçimi (Deadlock Victim): SQL Server, kilitlenen işlemlerden birini feda eder.
  • Geri Alma (Rollback): Seçilen işlemin yaptığı tüm değişiklikler geri alınır ve işlem iptal edilir.
  • Hata Mesajı: İptal edilen tarafa meşhur 1205 hata kodu gönderilir: “Transaction was deadlocked on lock resources…”

Genellikle geri alma maliyeti (rollback cost) en düşük olan işlem “kurban” olarak seçilir.

Deadlocklar sadece basit tablo kilitlenmelerinden ibaret değildir. Yaygın olarak karşılaşılan türler şunlardır:

  1. Sıralı Erişim Bozukluğu: Uygulama içindeki farklı prosedürlerin tablolara farklı sıralarla erişmesi en yaygın nedendir. (Önce A sonra B tablosuna erişen bir işlem ile önce B sonra A tablosuna erişen bir işlem çatışır).
  2. İndeks Yetersizliği: Bir sorgu indeks olmadığı için tüm tabloyu tarıyorsa (Table Scan), gereksiz yere çok fazla satırı kilitler ve diğer işlemlerle çakışma ihtimalini artırır.
  3. Bookmark Lookup Deadlock: Bir işlemin veriye ulaşmak için sürekli non-clustered indeksten clustered indekse (RID/Key lookup) atlaması sırasında oluşur.

Çözüm ve Önleme Stratejileri

Deadlockları %100 bitirmek her zaman mümkün olmayabilir ancak bunları minimize etmek profesyonel bir DBA sorumluluğundadır.

  • İşlem Sırasını Standartlaştırın: Tüm uygulama katmanlarında tablolara erişim sırasını aynı tutun (Örn: Daima önce Müşteri, sonra Sipariş tablosu).
  • Küçük İşlemler (Transactions): Transaction bloklarını mümkün olduğunca kısa tutun. Kullanıcı etkileşimini (User Input) asla bir transaction içine almayın.
  • İzleme ve Analiz: SQL Server’da Extended Events veya Trace Flag 1222 kullanarak deadlock grafiklerini (deadlock graph) analiz edin. Hangi kaynağın kilitlendiğini görmek çözümü hızlandırır.
  • Lock Hints (Dikkatli Kullanın): NOLOCK her zaman çözüm değildir (kirli veri okumaya neden olur), ancak READ COMMITTED SNAPSHOT (RCSI) izolasyon seviyesi, okuma ve yazma işlemlerinin birbirini engellemesini büyük ölçüde önler.

Deadlock bir hata değil, veritabanı motorunun veri bütünlüğünü korumak için kullandığı bir “acil fren” sistemidir. Başarılı bir veritabanı mimarisi, bu kilitlenmeleri takip eden, kurban seçilen işlemleri otomatik olarak yeniden deneyen (retry logic) ve kod seviyesinde çakışmaları en aza indiren yapıdır. Unutmayın, en iyi deadlock, analiz edilmiş ve yönetilebilir hale getirilmiş olan deadlock’tur.

Başka makalede görüşmek dileğiyle..

İyilikler için karşılık beklemeyin. İnsan-9

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir