मैं SQL सर्वर में ऐप लॉक अनुरोध को कैसे रद्द कर सकता हूं?


25

Sp_getapplock संग्रहीत प्रक्रिया के बाद वापसी मान हैं:

0: ताला सफलतापूर्वक सिंक्रनाइज़ किया गया था।
1: अन्य असंगत ताले जारी होने के इंतजार के बाद ताला सफलतापूर्वक दिया गया था।
-1: लॉक अनुरोध समय समाप्त हो गया।
-2: ताला अनुरोध रद्द कर दिया गया था।
-3: लॉक अनुरोध को एक डेडलॉक पीड़ित के रूप में चुना गया था।
-999: एक पैरामीटर सत्यापन या अन्य कॉल त्रुटि को इंगित करता है।

मैं sp_getapplockहमारे डेटा एक्सेस लेयर में कॉल करने के लिए एक आवरण लिख रहा हूं और मैं जानना चाहता हूं कि किन परिस्थितियों में -2 वापस किया जा सकता है ताकि मैं एक वर्णनात्मक और सहायक अपवाद फेंक सकूं। यह स्पष्ट है कि -1 और -3 के रिटर्न मान क्या हैं और मैं आसानी से परीक्षण की स्थिति बना सकता हूं जिससे उन मूल्यों को वापस लौटाया जा सके। मैं -2 का रिटर्न वैल्यू कैसे प्राप्त करूंगा?

जवाबों:


5

sp_getapplockआवरण खरीद के स्रोत को देखते हुए , -999 को छोड़कर सभी रिटर्न मान अंतर्निहित sys.xp_userlock आंतरिक संग्रहीत कार्यविधि से उत्पन्न होते हैं । जब कोई अनुरोध एक ईवेंट इवेंट (क्लाइंट क्वेरी टाइमआउट या क्लाइंट क्वेरी कैंसिल को एक्सप्लोर करता है) द्वारा रद्द कर दिया गया है, तो मैं आंतरिक खरीद रिटर्न -2 को शर्त लगा सकता हूं। हालांकि, sp_getapplockबैच रद्द होने के बाद कोई और कोड निष्पादित नहीं करता है, जिसमें RETURNबयान भी शामिल है। नतीजतन, -2 रिटर्न कोड आंतरिक रूप से वापस किया जा सकता है, लेकिन ग्राहक के लिए मूल्य प्राप्त करने का कोई व्यावहारिक तरीका नहीं है।

इस सिद्धांत को सही मानते हुए, -2 से अधिक वर्णनात्मक संदेश में अनुवाद करने में कोई मूल्य नहीं है क्योंकि यह क्लाइंट है जिसने अनुरोध को पहले स्थान पर रद्द कर दिया है।

मैं इसे डीबगर के साथ SQL डेटाबेस इंजन कोड के माध्यम से ले जाकर पुष्टि करने के लिए पॉल पर छोड़ दूंगा :-)


1

sp_getapplock, भौतिक वस्तुओं (प्रति MSDN) पर नहीं, अर्ध-छिद्रों पर ताले बनाता है। यह केवल एक और प्रक्रिया को रोक देगा यदि यह समान स्ट्रिंग और असंगत लॉक मोड के साथ sp_getapplock है।

तो लॉक अनुरोध को ऐसी परिस्थितियों में रद्द कर दिया जाएगा: उच्च विशेषाधिकार वाला उपयोगकर्ता लॉक को रद्द करता है, एक सर्वर प्रक्रिया लॉक को रद्द करता है, संग्रहीत प्रक्रिया को चलाने वाला उपयोगकर्ता या व्यवस्थापक लॉक प्रक्रिया को मारता है। आपका विवरण "सिस्टम या किसी अन्य उपयोगकर्ता द्वारा रद्द किया गया लॉक" हो सकता है। मुझे यकीन नहीं है कि आप उस वास्तविक प्रक्रिया / उपयोगकर्ता को कैसे निर्धारित करेंगे जो ताला को रद्द कर देता है।


-1

वहाँ एक इसी रिलीज आवेदन ताला संग्रहीत प्रक्रिया कहा जाता है जिसे sp_releaseapplock कहा जाता है।

मैं भी संदेहास्पद "एसक्यूएल में Mutexes" शीर्षक से एक लेख लिखा था यहाँ नियंत्रण आवेदन प्रवाह करने के लिए इन संग्रहित प्रक्रियाओं का उपयोग कर के बारे में एसक्यूएल सर्वर सेंट्रल पर।


4
लगता है कि आप शीर्षक में प्रश्न का उत्तर दे रहे हैं, लेकिन वास्तविक प्रश्न यह है कि "किन परिस्थितियों में sp_getapplock वापसी -2 होगी?"
मार्टिन स्मिथ

लॉक अनुरोध रद्द वास्तव में, यह एक अजीब है। प्रक्रिया बिना किसी लॉक के अपने स्वयं के अनुरोध को कैसे रद्द करेगी, यह जाने बिना कि इसे रद्द कर दिया गया है! आपको यह स्वीकार करना पड़ सकता है कि आप एक एमएस प्रदान करने के अलावा कोई सार्थक त्रुटि नहीं दे सकते - "लॉक अनुरोध रद्द कर दिया गया"।
टॉबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.