2010-06-25 4 views
48

मैं देख सकता हूं कि SQL सर्वर में पंक्ति स्तर और पृष्ठ स्तर लॉकिंग को कैसे बंद करें, लेकिन मुझे पंक्ति स्तर लॉकिंग का उपयोग करने के लिए SQL सर्वर को मजबूर करने का कोई तरीका नहीं मिल रहा है। पंक्ति स्तर लॉकिंग का उपयोग करने के लिए SQL सर्वर को मजबूर करने का कोई तरीका है और पृष्ठ स्तर लॉकिंग का उपयोग नहीं करते हैं?SQL सर्वर में पंक्ति स्तर लॉकिंग को मजबूर करना संभव है?

+1

मुख्य प्रश्न होता हो: ** क्यों ** पृथ्वी पर आप पहली बार में ऐसा करना चाहते हैं हैं जगह?? –

+3

मेरे पास दो SQL स्टेटमेंट्स डेडलॉक में चल रहे हैं, जिनकी मुझे उम्मीद नहीं थी। देखें: http://stackoverflow.com/questions/3112699/how-can-i-avoid-a-deadlock-between-these-two-sql-statements – Elan

+0

@marc_s मुझे वही आवश्यकता थी। तुम जानते हो क्यों? मेरे पास एक ऐसा स्पैम है जिसे समानांतर में चलाने की आवश्यकता है और जहां मेरे पास बड़ी संख्या में पंक्तियों द्वारा संशोधित करने के लिए एकाधिक तालिकाओं के लिए कोड है। कोई विचार नहीं कि इसे वैध और प्राकृतिक आवश्यकता के रूप में क्यों नहीं माना जाना चाहिए। समस्या यह है कि यह SQL सर्वर में deadlock का कारण बनता है .. – Mashrur

उत्तर

30

आप चप्पू-आंकड़ा संकेत का उपयोग कर सकते, लेकिन AFAIK एसक्यूएल अगर यह संसाधनों

From the doco पर कम चलाता है यह आगे भेजने के लिए तय कर सकते हैं:

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

और

लॉक संकेत चप्पू-आंकड़ा, UPDLOCK, और XLOCK कि पंक्ति-स्तर ताले प्राप्त वास्तविक डेटा पंक्तियों के बजाय सूचकांक कुंजी पर ताले डाल सकते हैं। उदाहरण के लिए, अगर एक तालिका nonclustered अनुक्रमणिका, और एक SELECT कथन एक ताला संकेत का उपयोग कर है एक कवर सूचकांक द्वारा नियंत्रित किया जाता, एक ताला में सूचकांक कुंजी सूचकांक को कवर के बजाय डेटा पंक्ति पर प्राप्त किया जाता है आधार तालिका में।

And finally इस SQL ​​सर्वर 2005 में ताला वृद्धि के बारे में एक बहुत में गहराई से स्पष्टीकरण जो एसक्यूएल सर्वर में बदल गया था देता है 2008

वहाँ भी है, बहुत गहराई में: Locking in The Database Engine (किताबों में ऑनलाइन)

तो, सामान्य रूप में

UPDATE 
Employees WITH (ROWLOCK) 
SET Name='Mr Bean' 
WHERE Age>93 

ठीक होना चाहिए, लेकिन अनुक्रमित और सर्वर पर लोड के आधार पर यह एक पृष्ठ का लॉक करने के लिए बढ़ते हो सकता है।

+9

बस जोड़ने के लिए, एसक्यूएल सर्वर 2008+ में आप प्रभावी रूप से 'वैकल्पिक तालिका तालिकानाम सेट (LOCK_ESCALATION = अक्षम) ' –

+0

[रीमस Rusanu के लिए आपकी टिप्पणियों के आधार पर] के साथ लॉक एस्केलेशन को अक्षम कर सकते हैं इसका मतलब है कि हम पंक्ति को लॉक करने के लिए कुछ भी नहीं कर सकते सब, ओरेकल यह कैसे करता है? – bjan

+0

@bjan सुनिश्चित नहीं है, सामान्य ओरेकल की स्नैपशॉट प्रकृति में इसका मतलब है कि यह किसी भी तरह की लॉकिंग आवश्यकताओं के लिए कम प्रवण है। आम तौर पर मैं किसी भी रोलॉक संकेत से बचूंगा, इसकी लगभग कभी आवश्यकता नहीं है –

7

आप वास्तव में कुछ भी करने के लिए अनुकूलक को मजबूर नहीं कर सकते हैं, लेकिन आप इसे मार्गदर्शन कर सकते हैं।

UPDATE 
Employees WITH (ROWLOCK) 
SET Name='Mr Bean' 
WHERE Age>93 

देखें - Controlling SQL Server with Locking and Hints

13

ALTER/CREATE INDEX की ALLOW_PAGE_LOCKS खंड का उपयोग करें:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF); 
+4

एक महत्वपूर्ण नोट यह है कि यह तालिका लॉक में बढ़ सकता है यदि यह संसाधनों पर कम चला जाता है –

+8

@ सैम: विवरण;) विज्ञापन में सत्य: मैं ** ** कभी भी अपने डेटाबेस पर इस बंद को चालू नहीं करूंगा। समाधान हमेशा स्कीमा और प्रश्नों को सही ढंग से डिजाइन करने के लिए होता है ताकि स्कैन (जो वृद्धि के लिए अपराधी हैं) शुरू नहीं होते हैं ... –

+0

पूरी तरह से सहमत हैं ... इस तरह के हैक्स की आवश्यकता के लिए बहुत दुर्लभ है और फिर वैसे भी आपको काटने का अंत –

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