2012-08-06 12 views
7

मेरे पास एक जटिल चयन क्वेरी और एक विशाल तालिका है।एसक्यूएल सर्वर - [SELECT] लॉक [अद्यतन] करता है?

मैं इस select बयान चल रहा हूँ, इस बीच एक Update बयान आता है और अद्यतन तालिका की कोशिश करता है।

IMHO - अद्यतन एक अनन्य लॉक की आवश्यकता है - तो अद्यतन बयान होगा करने के लिए इंतजार तक चयन आदेश समाप्त हो गया है। सही

  1. एम आई?

  2. है कि मैं क्या करने के लिए कर सकते हैं: जटिल update आदेश रन select, और भी करते हैं (वर्तमान में मैं गंदा डेटा के बारे में परवाह नहीं है) पर अमल

+1

आप किस लेनदेन अलगाव स्तर के बारे में बात कर रहे हैं? – Oded

+0

@ ओडेड डिफ़ॉल्ट - मुझे विश्वास है कि यह पढ़ा जाता है। –

+3

* "वर्तमान में मुझे गंदे डेटा की परवाह नहीं है" *: सावधान रहें [आप क्या चाहते हैं] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed- पंक्तियों-सकता होने वाली चूक-अगर-nolock-संकेत-है-used.aspx)। –

उत्तर

13

हाँ - करने के लिए एक उपाधि।

कब तक एक SELECT लेन-देन के अलगाव के स्तर पर निर्भर करता है एक साझा लॉक करने पर रखती है:

  • READ UNCOMMITTED - कोई साझा ताला सब पर प्राप्त किया जाता है - UPDATE अवरोधित नहीं है
  • READ COMMITTED - साझा लॉक को डेटा पढ़ने की अवधि के लिए अधिग्रहित किया जाता है - UPDATE बहुत कम समय के लिए अवरुद्ध हो सकता है
  • REPEATABLE READ और SERIALIZABLE - साझा लॉक अधिग्रहण किया जाता है और unti पर आयोजित किया जाता है एल लेन-देन के अंत - जो एक साझा ताला (के रूप में SELECT द्वारा प्रयुक्त) के साथ संगत है - - अवधि के लिए UPDATE अवरुद्ध है जब तक SELECT लेन-देन समाप्त होता है

तकनीकी तौर पर, UPDATE बयान पहली बार एक UPDATE ताला हो जाता है समय के साथ यह पंक्तियों के वर्तमान मूल्यों को अद्यतन करने के लिए पढ़ रहा है।

एक बार यह हो, Update ताला नए डेटा के लिए एक विशेष लॉक करने के लिए उठाई गई है मेज पर लिखा होना चाहिए।

+0

'अद्यतन विवरण पहले एक अद्यतन लॉक प्राप्त करता है - जो एक साझा लॉक के साथ संगत है' मैं मार्क समझ में नहीं आता। अद्यतन खत्म करने के लिए चयन करने का इंतजार कर रहा है? –

+1

@RoyiNamir: अद्यतन 'अपडेट' लॉक ("पुराना" डेटा पढ़ने के लिए) प्राप्त कर सकता है, जबकि दूसरी प्रक्रिया अभी भी उसी पंक्ति को पढ़ रही है और उस पंक्ति पर 'साझा' लॉक है। अपडेट एक विशेष लॉक ("नया" डेटा वापस लिखने के लिए) में सक्षम नहीं होगा, हालांकि, जब तक कि 'साझा' लॉक अभी भी मौजूद है - इसलिए इसे वहां प्रतीक्षा करनी होगी ... –

5

जब आप दो कथनों को एक साथ (एक चयन और अद्यतन) चलाते हैं तो वास्तविक व्यवहार मूल रूप से यादृच्छिक होगा। ऐसा इसलिए है क्योंकि संचालन में से कोई भी तात्कालिक नहीं है। सरल बनाने के लिए, अपनी तालिका को एक सूची पर विचार करें और चयन एक समय में एक पंक्ति को देखकर, इस सूची को घुमा रहा है। अद्यतन एक या एक से अधिक पंक्तियों को अपडेट करने का भी प्रयास कर रहा है। जब अद्यतन के पीछे पंक्ति को अद्यतन करने का प्रयास कर रहा है तो चयन करें कुछ भी नहीं होता अद्यतन पंक्ति जिस पर चयन लग रही है अभी अद्यतन करने के लिए कोशिश कर रहा है, तो तब नवीनीकृत करें के लिए प्रतीक्षा करने पर स्थानांतरित करने के लिए, जो बहुत बहुत बहुत तेजी से होगा होगा और अद्यतन अनवरोधित और सफल होगा, जबकि चयन आगे बढ़ रहा है। लेकिन अगर अद्यतन आगे चयन को अद्यतन कर रहा है तो अद्यतन सफल हो जाएगा और बाद में, अंततः अंत में इस पंक्ति तक पहुंच जाएगा और अवरुद्ध हो जाएगा।अब चयन को का इंतजार करना होगा जब तक कि UPDATE पर लेनदेन नहीं करता है।

यह सरलीकृत कहानी है। वास्तविक जीवन बहुत जटिल है। चयन में एकाधिक पढ़े गए अंक (समांतर योजनाएं) हो सकती हैं। चयन और अद्यतन दोनों एक पहुंच पथ चुनने के अधीन हैं, जिसका मतलब पंक्तियों का पता लगाने के लिए एक या अधिक माध्यमिक अनुक्रमणिका का उपयोग करना है। जटिल प्रश्नों में ऑपरेटर हो सकते हैं जो एक तालिका में एकाधिक लुकअप का कारण बनते हैं (उदाहरण के लिए।)। चयन और अद्यतन दोनों बीएलओबी डेटा लाने के लिए बुकमार्क लुकअप कर सकते हैं, जो महत्वपूर्ण रूप से लॉकिंग व्यवहार को बदलता है। कार्डिनालिटी अनुमान से उच्च ग्रॅन्युलैरिटी लॉक मोड (जैसे तालिका स्तर साझा लॉक) पर SELECT को चलाने का कारण हो सकता है। अद्यतन लॉक वृद्धि को ट्रिगर कर सकता है, और वृद्धि विफल हो सकती है या सफल हो सकती है। Choosing different access paths can lead to deadlockFalse lock contention can occur due to hash collisions। इसमें केवल एक असंख्य चर हैं जिनके बारे में कोई कहना है। और मैंने उच्च अलगाव स्तर का उल्लेख भी नहीं किया (दोहराने योग्य पढ़ने, धारावाहिक)।

शायद आपको SNAPSHOT अलगाव का उपयोग करना चाहिए और इस मुद्दे के बारे में चिंता करना बंद कर देना चाहिए?

+0

यदि आप 'स्नैपशॉट' के साथ जाने का सुझाव देते हैं - बस सुनिश्चित करें कि 'TempDB' ठीक तरह से स्थापित है! (स्थान और डेटा फ़ाइलों की संख्या, आकार बदलने आदि) –

+1

हां, दोहराने योग्य और धारावाहिक कारण लेनदेन के दायरे के लिए साझा लॉक को बनाए रखा जाना है। Serializable भी रेंज ताले जोड़ें। ये सभी जटिलता जोड़ें। –

+1

@marc_s: एमएसडीएन विषय के लिंक में [पंक्ति संस्करण संसाधन उपयोग] शामिल है (http://msdn.microsoft.com/en-us/library/ms175492 (v = sql.105))। मैं उपयोगकर्ताओं को डराने की इच्छा नहीं करता, क्योंकि मुझे लगता है कि स्नैपशॉट के लाभ इसकी लागत से बहुत अधिक हैं। –

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

  • कोई संबंधित समस्या नहीं^_^