Sql Server Engelleme

36882wired1.gif


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.


image-13.png

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:


Kod:
Select *
from sysprocesses
where blocked <> 0 ;

image-10.png

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 ;


Kod:
dbcc inputbuffer (SPID)

Şeklindedir.

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

Kod:
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.
image-11.png

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

image-12.png

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.

Kaynak:sqlekibi








 
Son düzenleme:

alexandre20

Katılımcı Üye
13 Tem 2022
908
11
716
edit: konunun eski haline cevap olarak yazılmıştır, bahsi geçen php kodu silinmiş o yüzden context yok.

Yararlı bir konu değil, paylaştığınız kod faydadan çok zarara sebep olacaktır, ayrıca bu şekilde bile bypass edilmesi mümkün gibi görünüyor. Sözde "güvenlik scripti" adı altında iç içe geçirilmiş 50 tane sanitization fonksiyonu kullanarak insanlara yanıltıcı ve kirli bir kod, daha doğrusu tehlikeli bir kod vermek yerine basitçe "prepared SQL" syntax'ı kullanmalarını gösterebilirdiniz.

Örnek:
PHP:
$stmt = $conn->prepare("INSERT INTO my_table (firstname, lastname) VALUES (?, ?)");
$stmt->bind_param("ss", $firstname, $lastname);
$firstname = "John";
$lastname = "Doe";
$stmt->execute();

Bu sayede gelen verideki özel karakterler sorun oluşturmaz ama eminim bunu hayatınızda ilk defa görüyorsunuzdur. Yetkinliğinizin olmadığı konularda paylaşım yapmanız yanıltıcı oluyor ve insanlar gerçekten sizin paylaştığınız kodu kullanırsa daha farklı sorunlarla karşılaşabilirlerdi. Mesela veritabanına özel karakter (^ < & vb.) kaydetmeleri durumunda sizin paylaştığınız fonksiyon bu karakterleri tamamen ortadan kaldıracağı veya başka formlara dönüştüreceği için farklı veri girilecekti.
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.