SQL SERVER BLOCKİNG

              Bu yazımızda SQL Server’da blocking yani engellemenin nasıl oluştuğunu inceleyeceğiz.

             SQL Server ilişkisel veri tabanlarında çok sayıda kullanıcı işlemi aynı anda işlenebilir. Bu durumda aynı tablo kayıtlarına aynı anda erişen farklı işlemlerin olması oldukça olası bir durumdur. 

Resim 1

             İki oturum aynı anda aynı verileri güncellemeye çalıştığında oluşan engelleme durumunda ilk oturum verileri kilitler ve ikinci oturumun ilkinin kilidi tamamlayıp serbest bırakmasını bekletir. Sonuç olarak, ikinci oturumun verileri güncellemesi engellenir. İlk oturum tamamlandıktan sonra ikinci oturum çalışmaya devam eder. Ancak, bir kaynak kilitlendiğinde ve diğer işlemler o kaynağı uzun süre beklemeye başladığında kilitler sorunlu bir duruma neden olabilir. Bu normal bir davranıştır ve sunucu performansını etkilemez.

            Bir ifadenin yürütülmesi sırasında hangi kaynaklara erişilmesi gerektiğine karar veren sistem veri tabanı motoru olarak adlandırılır. Karar alımında sonra Kilit Yöneticisi devreye girer ve gerçekleştirilen işlemin türüne ve etkilenecek veri miktarına göre uygun kilitlerin (satır, sayfa ve tablo) ayrıntı düzeyine karar verir.   SQL Server Kilit Yöneticisi, kaynaklar için farklı türde kilitler seçebilir. Engelleme, bir kaynak veya kaynaklar kümesi bir işlem tarafından kilitlendiğinde ve ardından başka bir işlem aynı kaynakları kilitlemek istediğinde başlayan bir bekleme durumudur. Böyle bir durumda, ikinci işlem kilitli nesnelerin serbest bırakılmasına kadar beklemeye başlar. 

           Birkaç saniyelik engelleme normaldir ve önlenebilir. Ancak aşırı miktarda engelleme, bağlantıların (uygulamalar veya kullanıcı) zamanınızın uzun dönemlerine katılmasına neden olabilir, bir engelleme koşulu sırasında alınması gereken en önemli bilgilerden en önemlisi, engelleme SPID’si (SQL işlem kimliği) ve ne yaptığıdır.

          Engelleme bilgilerini toplamak için aşağıdaki kod bloğundan faydalanabiliriz:

Select * 
from sysprocesses 
where blocked <> 0 ;

Resim 2

Bu kod bloğu çıktısı bize Resim 2 de olduğu gibi   spid, kpid, bloke, waittime, waittype, waitresource, lastwaittype, dbid, uid, cpu vb. colonlarını getirir.

           SPID’yi engellemeyi belirledikten sonra, içeriği teşvik etmek için sonraki komut ;

dbcc inputbuffer (SPID)

Şeklindedir.

          Engellemeyi kaldırmak için ise KILL komutunu kullanmak yeterlidir.


KILL SPID_ofBlockingQuery   /  KILL SPID

          Ancak burada bilinmesi gereken bir husus mevuttur. Bir işlemi KILL ettiğinizde yani öldürdüğünüzde, onu sonlandırmış olursunuz ve bu öngörülemeyen sonuçlara neden olur. 

          SQL Server Management Studio üzerinen de  sağlanan özellikleri kullanarak engelleme zincirinin başını da belirlemek mümkündür. Bunun için Resim 3’deki yolu izlememiz gerekmektedir.

Resim 3

        Server object’ e  bağlanarak Reports –  Standard Reports – Activity – All Blocking Transactions giriş sağlayalım.

Resim 4

         Karşımıza gelen ekrandaki rapor eğer engelleme işlemi mevcut olsaydı engelleme zincirinin en üstündeki işlemleri gösterir. Bu sayede engelleme işlemine ulaşım sağlayabiliriz. İşlemi genişletirseniz, rapor, üst işlem tarafından bloke edilen işlemleri gösterir. Bu rapor ayrıca Blocking SQL Statement” ve dolayısıyla “Blocked SQL Statement.” gösterecektir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir