SQL Server Blocking Chain: Find and Resolve the Head Blocker
Finds the head blocker, detects the open transaction and ends it safely. Covers RCSI and threshold settings to prevent recurrence.
Operational Safety & Risk Notice
This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.
1. Symptom & Signals
- Sorgular uzun süre `LCK_M_*` beklemesinde, uygulama zaman aşımları.
- M28 (bloklanan işlem) eşiği aşıldı.
- Çok sayıda oturumda `blocking_session_id <> 0`.
2. Business & Technical Impact
Etkilenen tablolara erişen tüm istekler yavaşlar veya durur. Bağlantı ve thread havuzları dolabilir.
3. Diagnosis & Root-Cause Analysis
SELECT r.session_id, r.blocking_session_id, r.wait_type, r.wait_time/1000 AS wait_sec,
DB_NAME(r.database_id) AS db, s.login_name, s.host_name, s.program_name
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON s.session_id = r.session_id
WHERE r.blocking_session_id <> 0
ORDER BY r.wait_time DESC;SELECT s.session_id, s.status, s.login_name, s.host_name, s.program_name,
s.last_request_end_time, t.text AS last_sql
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_connections c ON c.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
WHERE s.session_id = <bas_bloklayici>;DBCC OPENTRAN; -- mevcut veritabanındaki en eski transaction4. Remediation & Action Plan
1. Sahibini ve işin kritikliğini kontrol edin (toplu veri yükleme ortasındaysa kesmek uzun rollback yaratır).
KILL <bas_bloklayici>;
KILL <bas_bloklayici> WITH STATUSONLY; -- rollback ilerlemesi**Rollback uzun sürebilir** (transaction ne kadar sürdüyse yaklaşık o kadar). Oturumu tekrar `KILL` etmek rollback'i hızlandırmaz.
3. **Önleme:**
- Okuma/yazma çakışmasını azaltmak için **RCSI** değerlendirin (uygulamayı test edin, TempDB version store yükü artar):
ALTER DATABASE VeritabaniAdi SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;- Bloklanan süreyi raporlamak için eşik:
EXEC sp_configure 'blocked process threshold (s)', 20; RECONFIGURE;- Uygulamada transaction'ları kısa tutun, `SET LOCK_TIMEOUT` kullanın, eksik indeksler nedeniyle geniş kilitlenen sorguları düzeltin (S41 sonuçlarında tarama/yüksek okuma).
5. Verification & Health Checks
- Adım 1 sorgusu boş, M28 normale döndü.
- Bekleyen oturumlar tamamlandı, uygulama hata oranı düştü.
- Neden (uygulama bug'ı, toplu iş, eksik indeks) kaydedildi.
6. Rollback & Contingency Plan
- `KILL` geri alınamaz. Uygulama transaction'ı yeniden denemelidir.
- RCSI geri almak: `ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT OFF WITH ROLLBACK IMMEDIATE;`.