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.

 

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.

 

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.

 

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.

 

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

 

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.

Yazıyı beğendiyeseniz sosyal medyada paylaşabilirsiniz.

Yazar Hakkında

Avatar
İsmail Adar

cialis generic kamagra gel cheap cialis uk levitra uk cialis generic kamagra gel kamagra 100mg cheap cialis uk cheap levitra uk cheap cialis kamagra 100mg cialis tadalafil kamagra oral jelly cialis buy viagra generic levitra uk kamagra gel cialis generic cheap levitra cheap viagra uk

Yorumlar

Yorum Yazın

.com

Bülten Üyeliği

Güncel eğitim ve etkinliklerden ilk haberdar olmak için ücretsiz abone olun.

Login

Login olmak için kullanıcı adınızı ve şifrenizi giriniz.

Şifremi Unuttum

×

Hızlı İletişim

Her konuda bana yazabilirsiniz. En kısa zamanda cevap vereceğim.

×