SQL Server'da bir uygulama kilitleme isteğini nasıl iptal edebilirim?


25

Sp_getapplock saklı prosedür aşağıdaki dönüş değerlere sahiptir:

0: Kilit başarıyla eşzamanlı olarak verildi.
1: Diğer uyumsuz kilitlerin serbest bırakılmasını bekledikten sonra kilit başarıyla verildi.
-1: Kilitleme isteği zaman aşımına uğradı.
-2: Kilitleme isteği iptal edildi.
-3: Kilitlenme isteği kilitlenme kurbanı olarak seçildi.
-999: Parametre doğrulamasını veya başka bir çağrı hatasını gösterir.

sp_getapplockVeri erişim katmanımızı çağırmak için bir sarmalayıcı yazıyorum ve hangi şartlar altında -2'nin geri döndürülebileceğini bilmek istiyorum, böylece açıklayıcı ve yararlı bir istisna atayım. -1 ve -3 dönüş değerlerinin ne anlama geldiği açıktır ve bu değerlerin geri alınmasına neden olan test koşullarını kolayca oluşturabilirim. -2'lik bir getiri elde etmeyi nasıl başarırdım?

Yanıtlar:


5

Sarıcı işleminin kaynağına bakıldığında, sp_getapplock-999 hariç tüm geri dönüş değerleri, temeldeki sys.xp_userlock dahili saklı yordamdan kaynaklanır. İsteğin bir dikkat olayı tarafından iptal edilmesi durumunda dahili işlemin -2 döndürdüğünü iddia ediyorum (müşteri sorgusu zaman aşımı veya açık müşteri sorgusu iptal edildi). Ancak, sp_getapplocktoplu işlem iptal edildikten sonra RETURNifade dahil hiçbir kod çalıştırılmaz . Sonuç olarak, -2 dönüş kodu dahili olarak döndürülebilir, ancak müşterinin değeri alması için pratik bir yol yoktur.

Bu teorinin doğru olduğunu varsayarsak, isteği ilk başta iptal eden müşteri olduğundan -2'ye daha açıklayıcı bir mesaja geçmenin bir değeri yoktur.

Bunu bir hata ayıklayıcıyla SQL veritabanı motor kodu üzerinden geçerek onaylamak için Paul'a bırakacağım :-)


1

sp_getapplock fiziksel nesneler (sicil başına değil) değil semaforlarda kilitler oluşturur. Yalnızca aynı dizeyle ve uyumsuz bir kilit kipiyle sp_getapplock ise, başka bir işlemi engeller.

Bu nedenle, aşağıdaki koşullar altında kilit istekleri iptal edilir: yüksek ayrıcalıklara sahip bir kullanıcı kilidi iptal eder, bir sunucu işlemi kilidi iptal eder, saklı yordamı çalıştıran kullanıcı veya bir yönetici kilitleme işlemini öldürür. Açıklamanız "kilit sistemi veya başka bir kullanıcı tarafından iptal edildi" olabilir. Kilidi iptal eden gerçek işlemi / kullanıcıyı nasıl belirleyeceğinizden emin değilim.


-1

Sp_releaseapplock adı verilen ilgili bir Release uygulama kilidi saklı yordamı var.

Ben karıştırılabilecek "SQL muteksleri" başlıklı bir makale yazdı Burada kontrol uygulaması akışına Bu saklı yordamları kullanma hakkında SQL Server Central.


4
Başlıktaki soruyu yanıtlıyor gibi görünüyorsunuz, ancak asıl soru "Hangi durumlarda sp_getapplock -2 döndürür?"
Martin Smith

Kilitleme isteği iptal edildi. Gerçekten de, garip bir tane. İşlem, iptal edildiğini bilmeden kendi kilitleme isteğini nasıl iptal ederdi? MS sağladığından farklı bir hata veremeyeceğinizi kabul etmeniz gerekebilir - "Kilitleme isteği iptal edildi".
Toby,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.