2009-06-02 20 views
7

एसक्यूएल सर्वर पुस्तकें ऑनलाइन का कहना है जब कि "साझा (एस) एक संसाधन पर ताले जारी कर रहे हैं जैसे ही पढ़ा आपरेशन पूरा करता है, जब तक कि लेनदेन अलगाव स्तर को पढ़ने या उच्चतर repeatable पर सेट किया जाता है, या एक ताला संकेत लेनदेन की अवधि के लिए साझा (एस) ताले बनाए रखने के लिए प्रयोग किया जाता है। "साझा किए गए ताले लॉक कब जारी किए जाते हैं?

, यह मानते हुए कि हम एक पंक्ति-स्तर ताला के बारे में बात कर रहे हैं, कोई स्पष्ट लेनदेन के साथ, डिफ़ॉल्ट अलगाव स्तर (प्रतिबद्ध पढ़ें) पर क्या "आपरेशन पढ़ें" का उल्लेख करता है?

  • डेटा की एक पंक्ति की पढ़ाई?
  • एक 8k आईओ पृष्ठ का पठन?
  • या पूर्ण चयन कथन जिसमें लॉक बनाया गया था, निष्पादन समाप्त हो गया है, भले ही कितनी अन्य पंक्तियां शामिल हों?

नोट: कारण मैं यह जानता हूँ की जरूरत है हम कारण के साथ परस्पर विरोधी के लिए एक कई दूसरे केवल पढ़ने के लिए चयन बयान डेटा स्तर वेब सेवा है, जो पेज-स्तरीय साझा पढ़ने ताले बनाता द्वारा उत्पन्न की है, एक गतिरोध पैदा करने है एक प्रतिकृति प्रकोप से पंक्ति-स्तर अनन्य अद्यतन ताले जो सर्वर को अद्यतन रखता है। चुनिंदा बयान काफी बड़ा है, कई उप-चयनों के साथ, और एक डीबीए यह प्रस्तावित कर रहा है कि हम इसे कई छोटे कथन (छोटे चलने वाले टुकड़ों) में तोड़ने के लिए फिर से लिखते हैं, "ताले कितने समय तक काटते हैं"। जैसा कि यह मानता है कि साझा पिक लॉक तब तक आयोजित किए जाते हैं जब तक कि पूर्ण चयन कथन समाप्त नहीं हो जाता है, अगर यह गलत है (यदि पंक्तियां या पृष्ठ पढ़ा जाता है तो ताले जारी किए जाते हैं) तो उस दृष्टिकोण का कोई प्रभाव नहीं होगा ....

+0

यह SQL सर्वर संग्रहण इंजन से संबंधित एक तकनीकी प्रश्न है। यह पोस्ट सर्वरफॉल्ट डॉट कॉम पर बेहतर सेवा दी जा सकती है क्योंकि मुझे पता है कि वहां कुछ बहुत ही चुने गए एसक्यूएल सर्वर प्रशासक हैं। –

उत्तर

3

वास्तव में देखना बहुत दिलचस्प है, आप प्रोफाइलर को आग लगाना और लॉक अधिग्रहण/कुछ सरल प्रश्नों के रिलीज का पता लगाना चाहते हैं। मैं इस किया था थोड़ी देर पहले, यह कुछ ऐसा था: अधिग्रहण पेज 1 अधिग्रहण पंक्ति 1 अधिग्रहण पंक्ति 2 रिहाई पंक्ति 1 अधिग्रहण पंक्ति 3 रिहाई पंक्ति 2 अधिग्रहण पेज 2 रिहाई पेज 1 ...

मैं 100% सही नहीं हो सकता, लेकिन यह मूल रूप से दृष्टिकोण था। तो पंक्ति को पढ़ने के बाद लॉक जारी किया जाता है, या अगली पंक्तियों के लॉक के अधिग्रहण के बाद शायद यह सही ढंग से हो सकता है। मुझे संदेह है कि इसे ट्रैवर्सल के लिए एक सतत स्थिति रखने के साथ करना पड़ सकता है।

+0

धन्यवाद, किसी भी मौके से, क्या आपके पास कोई संदर्भ है जहां यह व्यवहार दस्तावेज है? –

+0

हालांकि आपके द्वारा वर्णित प्रोफाइलर आउटपुट बहुत निश्चित लगता है ... –

+0

@ चार्ल्स, मैं इस दस्तावेज को रेखांकित करने वाले किसी दस्तावेज़ में नहीं आया हूं। लेकिन जैसा कि आप कहते हैं, प्रोफाइलर आउटपुट बहुत निर्णायक है :) यदि आप उत्सुक हैं तो मैं आपको उस अभ्यास के माध्यम से जाने की सलाह देता हूं। – ahains

1

मैं नहीं मानता कि यह एक ही समय में दो पृष्ठ के स्तर ताले प्राप्त है। मुझे लगता है कि यह केवल प्रोफाइलर में दिखाई देता है क्योंकि घटनाएं इतनी जल्दी होती हैं। अगर यह होता है की तरह यदि आपको संदेह है, वहाँ हमेशा दो पेज स्तर ताले होगा, लेकिन जब साझा ताला के साथ एक बड़े क्वेरी चलाने, मैं कभी कभी इस क्वेरी के माध्यम से दो पेज स्तर ताले और कभी कभी एक देखें:

SELECT * 
FROM sys.dm_tran_locks 
WHERE request_session_id = <SPID> 

तो, मुझे लगता है कि हो रहा है:

  1. अधिग्रहण: साझा ताला db, टेबल ताला साझा, पृष्ठ साझा ताला
  2. पेज पढ़ने के लिए है ... पृष्ठ पर एक साथ रिलीज ताला और अगले पृष्ठ पर ताला प्राप्त

दो का परिणाम sys.dm_tran_lock क्वेरी में है कि कभी कभी है।मैं दो पेज ताले देख रहा हूं और कभी-कभी एक और कुछ बार तीन .. एक साथ क्रियाओं के दौरान तेजी से क्या होता है पर निर्भर करता है।

संबंधित मुद्दे