Pazar , 21 Ocak 2018

SQL Server Deadlock Kavramı ve Deaclok’ların Loglanması

Deadlock, eş zamanlı(Concurrent) çalışan sistemlerin doğal davranışlarından biridir. Kavram olarak iki farklı process’in işlemlerine devam edebilmeleri için birlerinin üzerinde çalıştığı kaynağı bekliyor olmasıdır. Böyle bir durumda her iki process’de devam edebilmek adına birbirlerini beklemektedir. Bu bekleme çok uzun sürüp bitmeyeceği için de SQL Server aralarında maliyeti düşük olanını seçerek ilgili processlerden birini onlandırıp diğerinin devam etmesini sağlar ki bu process’lerden birini donlandırması işlemi deadlock olarak adlandırılmaktadır.

Deadlock kavramı birçok kişi tarafından sorun olarak görülse bile aslında SQL Server tarafından alınmış bir önlemdir. Bu sebeple varsayılan olarak SQL Server’da deadlock oluştuğunda sadece işlemi sonlandırılan kullanıcıya da aşağıdaki gibi bir bilgi verilir ve diğer hatalardan farklı olarak Error log’a veya event viewer’a herhangi bir kayıt yazılmaz.

sql_server_deadlock1

 

Fakat veritarafında oluşan deadlock’ları minimize edip önlem alabilmek için bu hatanında SQL Server’ın loglarına yazılmasını isteyebiliriz. Bu durumda aşağıdaki iki tane trace flag’den birini veya iki tanesini aktif yapmamzı gerekecetir.

  • 1204 – deadlock’a sebep olan işlemlere ait detaylı bilgiyi text formatında görülmesini sağlar.
  • 1222 – deadlock’a ait özet bilginin XML formatından sunulmasını sağlar.

Yukarıdaki iki tane Trace Flag hem beraber kullanılabildiğini gibi ayrı ayrı da kullanılabilir. Bildiğiniz gibi SQL Server’da Trace Flag’ler aktifleştirilirken farklı yöntemler izleyebiliriz. Bunlardan bir tanesi Trace Flag değerinin SQL Server servisine –T parameyresiyle başlangıç parametresi olarak verilmesi, DBCC TRACEON komutuyla ilgili Flag’in ya o session’a özel ya da global olarak açılmasıdır.

Şimdi bu Trace Flag’lerden birini aşağıdaki gibi açalım ve daha sonra oluşan deadlock bilgilerinin SQL Server Error Loglarına nasıl yansıdığına bakalım.

DBCC TRACEON (1204, -1)

Yukarıdaki gibi DBCC TRACEON komutunu Trace Flag değeri ve -1 parametresi ile kullanarak açtığımızda aşağıdaki gibi bir deadlock oluşturalım ve SQL server Error Loglarını kontrol edelim. Örnek için ilk olarak aşağıdaki gibi iki tablo oluşturup tablomuza bir kaç kayıt ekleyelim.

sql_server_deadlock2

Yukarıdaki gibi tablolarımızı oluşturup kayıt girdikten sonra aşağıdaki gibi iki session açıp iki tane transaction başlatalım.

sql_server_deadlock3

Yukarıdaki örnekte gördüğümüz gibi her iki transaction aynı anda çalıştığında birinci transaction tarafından birinci tablonun birinci kaydı kullanılırken ikinci transactionda ise ikinci tablonun birinci kaydı kullanılmaktadır. Her iki transaction’ın da devam edebilmesi için birbirlerinin kullandığı kaynaklara ihtiyaç duymaktadır ve böyle bir durumda her iki transaction da bekleyecektir. Bu beklemeye önlemek adına SQL Server transaction’larda maliyeti en az olanını sonlandırıacak ve deadlock oluşacak ve aşağıdaki gibi bir hata mesajı verilecektir.

sql_server_deadlock1

Şimdi SQL Server Error loglarını kontrol edelim.

sql_server_deadlock4

Yukarıdaki resimde görüldüğü gibi SQL Server Error Loglarını incelediğimizde Deadlock ilgili ilgili olarak hangi objenin hatta hangi sorguların sebep olduğunu bile detaylı bir şekilde görebiliyoruz.

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>