क्या एक साधारण चयन क्वेरी ताले प्राप्त करता है?


14

मैं SQL सर्वर के लिए बहुत नया हूं, और यह समझना चाहूंगा कि क्या निम्न, बहुत सरल selectकथन किसी भी ताले को ले जाएगा।

Select * from Student;

कृपया उस मामले पर विचार करें जहां बयान एक begin tranब्लॉक के अंदर नहीं चल रहा है ।


1
यह एक बहुत अधिक जटिल प्रश्न है जितना आप सोच सकते हैं। इसका उत्तर कई बातों पर निर्भर करता है (सत्र लेन-देन अलगाव स्तर क्या है? पढ़ा गया स्नैपशॉट अलगाव चालू है? क्या स्कैन किए गए सूचकांक में पंक्ति या पृष्ठ लॉक को रोकने के लिए विकल्प हैं?) और कथन के चलने के दौरान भी बदल सकते हैं (कितने? पंक्तियाँ तालिका में हैं? तालिका विभाजित है?)। यहां पढ़ना शुरू करने के लिए एक अच्छा बिंदु है।
जॉन सिगेल

जवाबों:


5

हाँ, यह उन पंक्तियों पर एक साझा लॉक लेता है जिसे वह डिफ़ॉल्ट रूप से पढ़ता है (यह क्लस्टर इंडेक्स के सभी पृष्ठों पर एक इंटेंट शेयर्ड लॉक लेता है जिसे वह पढ़ेगा), यह गंदे रीड्स को रोकने के लिए किया जाता है। हालाँकि इसको बायपास करने के तरीके हैं (SQL Server में nolock hint है)। यदि कथन BEGIN TRAN में नहीं है, तो SELECT स्टेटमेंट चलने के बाद लॉक को छोड़ दिया जाता है।

और अधिक जानकारी यहां पाई जा सकती है:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server


इसके अलावा आप बिना पढ़े भी लेन-देन अलगाव स्तर निर्धारित कर सकते हैं।
ज़ेन

1
तो अगर SELECT दस पंक्तियों को पढ़ता है, तो क्या दस साझा पंक्तियों को तब तक आयोजित किया जाता है जब तक कि सभी दस पंक्तियों को पढ़ नहीं लिया जाता है या उन्हें प्रति पंक्ति में अधिग्रहित और जारी नहीं किया जाता है?
इयान वारबर्टन

26

मैं यह समझना चाहूंगा कि क्या निम्नलिखित, बहुत सरल चयन विवरण किसी भी ताले को ले जाएगा

यह एक गलत धारणा है कि गंदे रीड्स को रोकने के SELECTलिए डिफॉल्ट READ COMMITTEDट्रांजैक्शन आइसोलेशन लेवल पर चलने वाली क्वेरी हमेशा साझा लॉक लेगी।

SQL सर्वर साझा पंक्ति-स्तरीय लॉक लेने से बच सकता है, जब उनके बिना uncommitted डेटा पढ़ने का कोई खतरा नहीं है (हालांकि उच्च-स्तरीय इंटेंट-साझा (IS) ताले अभी भी लिए गए हैं)।

यहां तक ​​कि अगर साझा पंक्ति ताले को लिया जाता है (शायद इसलिए कि एक और समवर्ती लेनदेन ने पृष्ठ को पंक्ति को संशोधित किया है) उन्हें SELECTबयान पूरा होने से बहुत पहले जारी किया जा सकता है ।

ज्यादातर मामलों में, अगली पंक्ति को सर्वर संसाधित करने से ठीक पहले पंक्ति को 'अनलॉक' किया जाता है। ऐसी परिस्थितियां हैं जिनमें डिफ़ॉल्ट अलगाव स्तर पर साझा किए गए ताले वर्तमान वक्तव्य के अंत तक आयोजित किए जाते हैं, लेकिन लेनदेन के अंत तक नहीं ।

NOLOCKतालिका संकेत के साथ वर्तमान अलगाव स्तर को ओवरराइड करना लगभग हमेशा एक बुरा विचार है

लॉकिंग एक कार्यान्वयन विवरण है। SQL सर्वर ताले को लेता है जब यह सुनिश्चित करने के लिए आवश्यक हो कि यह वर्तमान अलगाव स्तर द्वारा प्रदान की गई शब्दार्थ गारंटी से मिलता है । निश्चित रूप से ऐसे समय होते हैं जहां ताले को क्यों लिया जाता है, इसके बारे में थोड़ा-बहुत जानना उपयोगी है, लेकिन उनकी भविष्यवाणी करने का प्रयास बहुत बार काउंटर-उत्पादक होता है।

एसक्यूएल सर्वर अलगाव स्तर की एक विस्तृत विविधता प्रदान करता है; वह चुनें, जो आपके डेटा उपभोक्ताओं की गारंटी और व्यवहार प्रदान करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.