SQL Deadlock (Kilitlenme) Çözüm Rehberi

Hazırlayan: IT Uzmanı Arif TOK

1. Sorunun Kaynağı

Deadlock, iki veya daha fazla işlemin (transaction) birbirinin kilitlediği kaynakları beklemesi sonucu oluşan sonsuz döngüdür. SQL Server, sistemi kurtarmak için işlemlerden birini iptal eder (victim).

2. Deadlock'ları Tespit Etme

Hangi sorguların deadlock yarattığını görmek için SQL Server'da 1222 numaralı Trace Flag'i aktif edebilirsiniz.

DBCC TRACEON (1222, -1); GO -- Bu komut kilitlenme loglarını ERRORLOG dosyasına yazar.

3. NOLOCK Kullanımı (Okuma Sorguları)

Raporlama gibi anlık, milisaniyelik verinin kritik olmadığı okuma işlemlerinde WITH (NOLOCK) hint'i kullanarak tabloların kilitlenmesini önleyebilirsiniz.

SELECT OrderID, CustomerName, TotalAmount FROM Orders WITH (NOLOCK) WHERE Status = 'Pending';

4. Index Optimizasyonu

Eksik indeksler SQL Server'ın tüm tabloyu taramasına (Table Scan) neden olur. Bu da tablonun tamamını kilitler. WHERE şartında sık kullanılan kolonlara Non-Clustered Index ekleyin.

CREATE NONCLUSTERED INDEX IX_Orders_Status ON Orders (Status) INCLUDE (OrderID, CustomerName, TotalAmount);

UZMAN TAVSİYESİ

Büyük tablolara yeni index eklerken tablonuz geçici olarak kilitlenebilir, bu yüzden index oluşturma işlemlerini sistemin en az kullanıldığı saatlerde yapmaya özen gösterin.