Extended Events Kullanarak DeadLock’a Düşen Sorguları Yakalamak
Uygulamacılar bazen deadlock hatası alırlar ve hangi sorgularda bu hatayı aldıklarını göremezler. Bu yüzden veritabanında deadlock hatası alıyoruz diyerek kapınızı çalabilirler. Böyle bir durumda Extended Events ya da SQL Server Profiler kullanarak deadlock’a düşen sorguları yakayalayabiliriz.
DeadLock Nedir sorusunun cevabını “SQL Server’da DeadLock Nedir?” isimli makalemde bulabilirsiniz.
Extended Event kullanarak DeadLock’a düşen sorguları yakalayalım:
SSMS üzerinde Managements’ın altında Extended Events altındaki Session’a sağ tıklayarak New Session Wizard Diyoruz.
Bir sonraki gelen ekranda Do not show this page again’i tıklayarak next diyoruz.
Bir sonraki gelen ekranda Session name kısmına DeadLock yazıyorum Start the event session at server startup’ı seçmiyorum. Çünkü server başladığında bu session’ın otomatik olarak başlamasını istemiyorum.
Bir sonraki ekranda Do not use template diyerek next diyorum.
Bir sonraki ekranda aşağıda görüldüğü gibi Event Library kısmına deadlock yazıyorum ve deadlock ile ilgili eventlar hemen altında listeleniyor.
Ben grafiksel bir şekilde görmek için sadece xml deadlock report’a 2 kere tıklıyorum ve next diyorum.
Bir sonraki ekranda aşağıdaki seçenekleri seçiyorum.
Client hostname
Client app name
Database name
Sql text
User name
Bir sonraki ekranda aşağıdaki gibi filter koyabilirsiniz. Ya da oluşturduktan sonra da session üzerinde sağ tıklayıp properties’den Events’a gelip Configure diyerek filtre koyabilirsiniz.
Daha sonraki ekranlarda next next finish diyerek işlemi tamamlıyoruz ve oluşan session’ın üzerine gelip aşağıdaki gibi start ediyoruz.
Session üzerinde watch live data dediğimizde karşımıza aşağıdaki gibi bir ekran gelecektir.
Details kısmından xml_report’ a çift tıklayınca hangi sorgunun hangi sorguyu deadlock’a düşürdüğünü görebiliriz. <victim-list> teki process kurban olarak seçilen process’tir.
DeadLock kısmında karşımıza aşağıdaki gibi bir ekran gelecektir. Üzerinde X işareti olan transaction kurban olarak seçilen transactiondır. Diğer ise yoluna devam eden transaction. Bu daire içine alınmış transaction’ların üzerine geldiğinizde ilgili sorgu görünecektir.