2013-01-07 32 views
5

मैंने लेनदेन के लिए एक धारावाहिक लेनदेन अलगाव लॉक सेट किया है। लेकिन मैं कुछ ऐसे परिणाम देख रहा हूं जिनकी अपेक्षा नहीं है।धारावाहिक लेनदेन अलगाव लॉक

मेरे क्वेरी

update tabl1 set col2 = 10 where col1 > 10 and col1 < 20 

यहाँ है col1 col1 मूल्य 10,11,12 .... 19,20 होने के साथ प्राथमिक key.Here पंक्तियों अद्यतन/डालने के लिए बंद कर दिया जाता है। जहां स्थिति में मैंने col1> 10 और col1 < 20 के रूप में स्थितियां दी हैं, लेकिन अभी भी col1 = 10 और col1 = 20 होने वाली पंक्तियां लॉक हो गई हैं।

तो मैं दे

update tabl1 set col2 = 10 where col1 => 10 and col1 <= 20 

तो 9 से 21 के col2 होने मूल्यों के साथ पंक्तियों हो जाता है locked.So क्यों col1 होने 9 और 21 यहाँ बंद कर दिया जाता है?

नीचे दी गई क्वेरी के लिए पूर्ण तालिका लॉक हो जाती है। यहां col3 एक गैर-प्राथमिक स्तंभ है। क्या मैं लॉक सेट नहीं कर सकता हूं, जहां कॉलम प्राथमिक स्थिति नहीं है?

update tabl1 set col2 = 10 where col3 > 10 and col3 < 20 

उत्तर

4

कुंजी रेंज ताला एसक्यूएल सर्वर के लिए सीमा हालत इतनी अपने पिछले प्रश्न के बारे में पूरा करने के एक सूचकांक का उपयोग करना चाहिए आप पर col3 (और संभवत: यदि योजना के लिए इसका इस्तेमाल नहीं करता है इसके उपयोग के लिए मजबूर करने का संकेत एक सूचकांक की आवश्यकता होगी)

इसके अलावा यह आपके WHERE खंड में विशिष्ट सीमा को लॉक नहीं करता है। यह चाबियाँ ताला लगा देता है। किसी कुंजी पर एक रेंज लॉक उस कुंजी से नीचे की कुंजी तक की सीमा को सुरक्षित करता है, इसलिए अवरुद्ध होने वाली सटीक सीमा इस बात पर निर्भर करती है कि इंडेक्स में कौन सी कुंजी मौजूद है।

अधिक जानकारी/लिंक in my answer here

+0

हैं लेकिन जो सूचकांक? इस्तेमाल किया जाना चाहिए क्लस्टर किया गया या गैर क्लस्टर? – wincoding

+0

@wincoding - इससे कोई फर्क नहीं पड़ता SQL सर्वर तब तक कुंजी रेंज लॉक ले सकता है जब तक कि वह 'WHERE' को हल करने के लिए उस अनुक्रमणिका का उपयोग करता है –

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