यह काम क्यों नहीं करता?
मेरा मानना है कि SQL सर्वर का डिफ़ॉल्ट व्यवहार साझा किए गए ताले को जल्द से जल्द जारी करना है, जिनकी अब आवश्यकता नहीं है। आपकी उप-क्वेरी के परिणामस्वरूप टेबल पर एक अल्पकालिक साझा (एस) लॉक हो जाएगा, जो उप-क्वेरी के पूरा होते ही जारी कर दिया जाएगा।
इस बिंदु पर समवर्ती लेन-देन को उसी पंक्ति को सम्मिलित करने से रोकने के लिए कुछ भी नहीं है जिसे आपने अभी सत्यापित किया था जो मौजूद नहीं थी।
मुझे क्या संशोधन करने की आवश्यकता है ताकि बाधा उल्लंघन के कारण अपवाद की कोई संभावना न रहे?
HOLDLOCK
जोड़ना आपकी उप-क्वेरी का संकेत लेन-देन पूरा होने तक SQL सर्वर को लॉक पर बने रहने का निर्देश देगा। (आपके मामले में, यह एक अंतर्निहित लेनदेन है।) HOLDLOCK
संकेत SERIALIZABLE
. के बराबर है संकेत, जो स्वयं क्रमबद्ध लेनदेन अलगाव स्तर के बराबर है जिसे आप "अन्य दृष्टिकोणों" की अपनी सूची में संदर्भित करते हैं।
HOLDLOCK
अकेले संकेत एस लॉक को बनाए रखने और समवर्ती लेनदेन को उस पंक्ति को सम्मिलित करने से रोकने के लिए पर्याप्त होगा जिसके खिलाफ आप रक्षा कर रहे हैं। हालांकि, आप अपनी अनूठी कुंजी उल्लंघन त्रुटि को एक ही आवृत्ति पर होने वाले गतिरोधों द्वारा प्रतिस्थापित पाएंगे।
यदि आप टेबल पर केवल एक एस लॉक रख रहे हैं, तो एक ही पंक्ति को सम्मिलित करने के दो समवर्ती प्रयासों के बीच एक दौड़ पर विचार करें, लॉकस्टेप में आगे बढ़ते हुए - दोनों टेबल पर एस लॉक प्राप्त करने में सफल होते हैं, लेकिन न तो एक्सक्लूसिव प्राप्त करने में सफल हो सकते हैं (X) इंसर्ट को निष्पादित करने के लिए आवश्यक लॉक।
सौभाग्य से इस सटीक परिदृश्य के लिए एक और लॉक प्रकार है, जिसे अपडेट (यू) लॉक कहा जाता है। यू लॉक निम्नलिखित अंतर के साथ एस लॉक के समान है:जबकि एक ही संसाधन पर एक साथ कई एस लॉक आयोजित किए जा सकते हैं, एक समय में केवल एक यू लॉक आयोजित किया जा सकता है। (दूसरे तरीके से कहा, जबकि एस ताले एक दूसरे के साथ संगत हैं (यानी संघर्ष के बिना सह-अस्तित्व में हो सकते हैं), यू ताले एक दूसरे के साथ संगत नहीं हैं, लेकिन एस ताले के साथ सह-अस्तित्व में हो सकते हैं; और आगे स्पेक्ट्रम के साथ, अनन्य (एक्स) ताले नहीं हैं S या U लॉक के साथ संगत)
आप UPDLOCK
का उपयोग करके अपनी उप-क्वेरी पर निहित S लॉक को U लॉक में अपग्रेड कर सकते हैं संकेत।
तालिका में एक ही पंक्ति को सम्मिलित करने के दो समवर्ती प्रयासों को अब प्रारंभिक चयन कथन पर क्रमबद्ध किया जाएगा, क्योंकि यह एक यू लॉक प्राप्त करता है (और रखता है), जो समवर्ती सम्मिलन प्रयास से दूसरे यू लॉक के साथ संगत नहीं है।
शून्य मान
इस तथ्य से एक अलग समस्या उत्पन्न हो सकती है कि FieldC NULL मानों की अनुमति देता है।
अगर ANSI_NULLS
चालू है (डिफ़ॉल्ट) तो समानता जांच FieldC=NULL
झूठी वापसी होगी, यहां तक कि उस स्थिति में भी जहां फील्डसी न्यूल है (आपको IS NULL
का उपयोग करना चाहिए ANSI_NULLS
. होने पर ऑपरेटर को शून्य की जांच करने के लिए चालू है)। चूंकि FieldC अशक्त है, इसलिए NULL मान डालने पर आपका डुप्लिकेट चेक काम नहीं करेगा।
नल के साथ सही ढंग से निपटने के लिए आपको IS NULL
का उपयोग करने के लिए अपनी EXISTS उप-क्वेरी को संशोधित करने की आवश्यकता होगी =
. के बजाय ऑपरेटर जब NULL का मान डाला जा रहा है। (या आप सभी संबंधित कॉलम में NULLs को अस्वीकार करने के लिए तालिका को बदल सकते हैं।)
SQL सर्वर पुस्तकें ऑनलाइन संदर्भ
- लॉकिंग संकेत
- संगतता मैट्रिक्स लॉक करें
- ANSI_NULLS