उम्मीद के मुताबिक
-
ORDER BY के साथ चयन करें, बिना ROWLOCK के, बिना अनुक्रमणिका के, TOP 2 पर काम करने के लिए स्कैन/मध्यवर्ती प्रकार के कारण टेबल लॉक होगा। इसलिए दूसरा सत्र रीडपास्ट के कारण पूरी तालिका को छोड़ देता है
-
ऑर्डर के बिना चयन केवल 2 पंक्तियों को चुन रहा है, जो सम्मिलित होने के क्रम में होता है (शुद्ध संयोग, कोई निहित आदेश नहीं है)। तथ्य यह है कि ये 2 पंक्तियाँ लॉक हैं, दूसरे सत्र को अगली गैर-लॉक की गई पंक्तियों पर छोड़ देता है।
SQL सर्वर ताले को यथासंभव दानेदार रखने का प्रयास करता है लेकिन स्कैन का अर्थ है एक टेबल लॉक। अब, इससे आम तौर पर कोई फर्क नहीं पड़ेगा (यह एक साझा पठन लॉक होगा) लेकिन आपके पास UPDLOCK भी है जिसका अर्थ है एक विशेष रूप से लॉक की गई तालिका
तो, आपको इन दोनों की ज़रूरत है
- विवरण, अलगाव और समवर्तीता को नियंत्रित करने के लिए SELECT क्वेरीज़ (ROWLOCK, UPDLOCK, READPAST) में 3 संकेत।
केवल ROWLOCK का उपयोग करने से अभी भी प्रत्येक पंक्ति पर स्कैन/सॉर्ट करने के लिए एक विशेष लॉक हो जाएगा। Value
पर एक अनुक्रमणिकाTestID
शामिल करें चयन को कुशल बनाने के लिए। एक अनुक्रमणिका केवल संगामिति को ठीक करेगी लेकिन इसकी गारंटी नहीं होगी।
आपके पिछले प्रश्नों में से एक में मैंने अपने उत्तर (एक टिप्पणी में) को एसक्यूएल सर्वर प्रोसेस क्यू रेस कंडीशन जहां मेरे पास सभी 3 लॉक संकेत हैं