2011-02-24 9 views
53

TABLOCK और TABLOCKXhttp://msdn.microsoft.com/en-us/library/ms187373.aspx के बीच का अंतर क्या है कि TABLOCK एक साझा लॉक है जबकि TABLOCKX एक विशेष लॉक है। क्या पहली बार केवल एक इंडेक्स लॉक है? और लॉक साझा करने की अवधारणा क्या है?टैबलेट बनाम टैबब्लैक

+8

यह कहता है कि 'टैबब्लॉक' एक * साझा * लॉक है जो एकाधिक क्लाइंट को तालिका में डेटा को समेकित रूप से लोड करने की इजाजत देता है। एक विशेष ताला नहीं है। –

+0

@Lieven tablocks के साथ पारस्परिक विशिष्टता को लॉक से बाहर रखा गया है जिसमें डेटाटेबल को आरक्षित पृष्ठ मेमोरी चक्र में शामिल किया जाता है। – Roel

उत्तर

75

बड़ा अंतर, TABLOCK "साझा" ताले, और TABLOCKX विशेष ताले को पकड़ने का प्रयास करेगा।

आपका लेन-देन में हैं और आप एक मेज पर एक विशेष ताला हड़पने, तो ईजी:

SELECT 1 FROM TABLE WITH (TABLOCKX)

कोई अन्य प्रक्रियाओं सभी अर्थ, मेज पर किसी भी ताले हड़पने के लिए सक्षम हो जाएगा तालिका से बात करने का प्रयास करने वाले प्रश्नों को तब तक अवरुद्ध कर दिया जाएगा जब तक लेनदेन नहीं होता है।

TABLOCK केवल एक साझा लॉक पकड़ लेता है, यदि आपका लेनदेन अलगाव READ COMMITTED (डिफ़ॉल्ट) है तो एक कथन निष्पादित होने के बाद साझा ताले जारी किए जाते हैं। अपने अलगाव स्तर is higher, उदाहरण के लिए, तो: SERIALIZABLE, साझा ताले एक सौदे के अंत तक आयोजित की जाती हैं।


साझा ताले, हमम, साझा किए गए हैं। 2 लेन-देन मतलब दोनों एक ही समय में तालिका से डेटा पढ़ सकते हैं अगर वे दोनों एक एस पकड़ या (TABLOCK के माध्यम से) मेज पर ताला है। हालांकि, अगर transaction A एक मेज पर एक साझा ताला रखती है, transaction B नहीं एक विशेष ताला हड़पने के लिए जब तक सभी साझा ताले जारी कर रहे हैं सक्षम हो जाएगा। पढ़ें कि कौन से ताले संगत हैं at msdn


दोनों संकेत डीबी को अधिक दानेदार ताले (जैसे पंक्ति या पृष्ठ स्तर ताले) लेने के लिए बाईपास का कारण बनते हैं।सिद्धांत रूप में, अधिक दानेदार ताले आपको बेहतर समेकन की अनुमति देते हैं। तो उदाहरण के लिए, एक लेनदेन आपकी तालिका में पंक्ति 100 को अपडेट कर सकता है और एक ही पंक्ति 1000, एक ही समय में दो लेनदेन से अपडेट हो सकता है (यह पृष्ठ ताले के साथ मुश्किल हो जाता है, लेकिन इसे छोड़ने देता है)।

सामान्य दानेदार ताले में आप जो चाहते हैं, लेकिन कभी-कभी आप किसी विशेष ऑपरेशन के प्रदर्शन को बढ़ाने और डेडलॉक्स के अवसर को खत्म करने के लिए डीबी समरूपता को कम करना चाहते हैं।

सामान्य रूप से आप TABLOCK या TABLOCKX का उपयोग नहीं करेंगे जबतक कि आपको किसी किनारे के मामले के लिए बिल्कुल इसकी आवश्यकता नहीं होती है।

+7

उदाहरण के लिए, उन किनारे के मामलों में से एक ऐसी स्थिति है जहां आप प्रारंभ में तालिका बनाते हैं और डेटा के साथ इसे भरते हैं, कहें, 'INSERT INTO'। ऐसी परिस्थितियों में एक विशेष लॉक आपको एक बड़ा प्रदर्शन लाभ दे सकता है। – Abel

+1

अर्थ ** ** ** ** ** तालिका में ** बात करने का प्रयास करने वाले सभी ** प्रश्न लेनदेन किए जाने तक अवरुद्ध हो जाएंगे। यह सच नहीं है। आप अभी भी NOLOCK या ट्रांज़ेक्शन इशोलेशन लेवल के साथ पढ़ सकते हैं अनमोल –

+0

यह एसक्यूएल सर्वर 2016 पर काम नहीं कर रहा है? –

4

काफी एक पुराने article on mssqlcity ताले के प्रकार की व्याख्या करने के प्रयास:

साझा ताले कार्य है कि परिवर्तन नहीं करते या इस तरह के एक का चयन करें बयान के रूप में अद्यतन डेटा, के लिए उपयोग किया जाता है।

अद्यतन ताले उपयोग किया जाता है जब एसक्यूएल सर्वर एक पृष्ठ को संशोधित करने का इरादा रखता है, और बाद वास्तव में परिवर्तन करने से पहले एक विशेष पृष्ठ लॉक करने के लिए अद्यतन पृष्ठ के लॉक को बढ़ावा देता है।

विशेष ताले ऐसे अद्यतन, सम्मिलित करें, या उसे हटाने के रूप में डेटा संशोधन संचालन, के लिए उपयोग किया जाता है।

जो चर्चा नहीं करता है वह इरादा है (जो मूल रूप से इन लॉक प्रकारों के लिए एक संशोधक है)। इरादा (साझा/एक्सक्लूसिव) ताले वास्तविक लॉक की तुलना में उच्च स्तर पर ताले होते हैं। तो, उदाहरण के लिए, यदि आपका लेन-देन एक पंक्ति पर एक एक्स ताला है, यह भी तालिका स्तर पर एक नौवीं ताला (जो मेज पर एक उच्च स्तर पर एक असंगत ताला प्राप्त करने का प्रयास से अन्य लेन-देन बंद हो जाता है (उदाहरण के लिए एक स्कीमा होगा संशोधन लॉक) जब तक कि आपका लेनदेन पूरा न हो या वापस रोल न हो)।


"साझा" एक ताला काफी सीधा है की अवधारणा - कई लेनदेन जबकि केवल एक ही लेन-देन एक विशेष लॉक हो सकता है, एक ही संसाधन के लिए एक साझा लॉक हो सकता है, और एक विशेष ताला से किसी भी लेन-देन precludes साझा लॉक प्राप्त करना या पकड़ना।

+0

क्या ताले कितने समय तक हैं? अंतःक्रिया तक टैबलेट आयोजित किया जाता है। यदि होल्डॉक को भी निर्दिष्ट किया गया है, तो साझा तालिका लॉक लेनदेन के अंत तक आयोजित किया जाता है। लेकिन TABLOCKX –

+0

@ करलो के बारे में क्या - लेनदेन के अंत तक विशिष्ट ताले हमेशा आयोजित होते हैं। –

+1

@ करलो, सभी साझा ताले एक पठित लेनदेन में एक बयान के अंत में जारी किए जाते हैं, यदि आप उन ताले को पकड़ना चाहते हैं जिन्हें आपको संकेत या उच्च अलगाव स्तर की आवश्यकता है। 'tablockx' एक एक्स लॉक पकड़ लेंगे। –

1

यह एक उदाहरण है जहां टैबलेट ने मेरे लिए काम नहीं किया था और टैबब्लैक ने किया था।

मैं 2 सत्र है, कि दोनों डिफ़ॉल्ट का उपयोग (पढ़ें कमिट) अलगाव का स्तर:

सत्र 1 एक स्पष्ट लेनदेन है कि एक डेटाबेस में तालिकाओं का एक सेट के लिए लिंक किया सर्वर से डेटा कॉपी जाएगा, और ले जाता है चलाने के लिए कुछ सेकंड। [उदाहरण, यह प्रश्न हटा देता है] सत्र 2 एक सम्मिलित कथन है, जो कि पंक्तियों को केवल उस तालिका में सम्मिलित करता है जो सत्र 1 में परिवर्तन नहीं करता है। [उदाहरण, यह उत्तर सम्मिलित करता है]।

(प्रैक्टिस में तालिका में कई रिकॉर्ड डालने वाले कई सत्र होते हैं, साथ ही, सत्र 1 अपना लेनदेन चला रहा है)।

सत्र 1 को तालिका 2 प्रविष्टियों से पूछताछ करना है क्योंकि यह सत्र 2 द्वारा जोड़े गए प्रविष्टियों पर निर्भर रिकॉर्ड को हटा नहीं सकता है। [उदाहरण: उन प्रश्नों को हटाएं जिन्हें उत्तर नहीं दिया गया है]।

इसलिए, सत्र 1 निष्पादित हो रहा है और सत्र 2 सम्मिलित करने का प्रयास करता है, सत्र 2 हर समय एक डेडलॉक में खो देता है।

तो, सत्र 1 में एक नष्ट बयान कुछ इस तरह दिख सकता है: tblQ बाएं से tblA DELETE पर ... बायाँ शामिल हों tblA एक पर tblQ.Qid = tblA.Qid कहां ... एक tblX शामिल हों। क्यूआईडी नल और ...

सत्र 2, [3, 4, 5, ..., n] tbla में डालने का प्रयास करते समय डेडलॉक tbla से पूछताछ के बीच विवाद से उत्पन्न होता है।

मेरे मामले में मैं सत्र 1 के लेनदेन के अलगाव स्तर को गंभीर हो सकता है। जब मैंने ऐसा किया: लेनदेन प्रबंधक ने रिमोट/नेटवर्क लेनदेन के लिए अपना समर्थन अक्षम कर दिया है।

तो, मैं स्वीकार किए जाते हैं जवाब यहाँ के निर्देशों का पालन कर सकता है उसके चारों ओर पाने के लिए: The transaction manager has disabled its support for remote/network transactions

लेकिन एक) मैं पहली बार place- में serializable के अलगाव के स्तर को बदलने के साथ सहज नहीं था माना जाता है कि यह प्रदर्शन खराब हो और अन्य परिणाम हो सकते हैं जिन पर मैंने विचार नहीं किया है, बी) यह समझ में नहीं आया कि ऐसा क्यों करने से लेनदेन को लिंक किए गए सर्वरों पर काम करने में समस्या हो रही है, और सी) यह नहीं पता कि नेटवर्क को सक्षम करके मैं कौन से संभावित छेद खोल सकता हूं पहुंच।

परेशानी पैदा करने वाले बहुत बड़े लेनदेन के भीतर केवल 6 प्रश्न होने लगते थे।

तो, मैंने टैबलेट और टैबब्लैक के बारे में पढ़ा।

मैं मतभेदों पर क्रिस्टल स्पष्ट नहीं था, और यह नहीं पता था कि या तो काम करेगा या नहीं। लेकिन ऐसा लगता है कि यह होगा। सबसे पहले मैंने टैबलेट की कोशिश की और ऐसा कोई फर्क नहीं पड़ता। प्रतिस्पर्धी सत्रों ने एक ही डेडलॉक्स उत्पन्न किए।तब मैंने टैब्लोक्स की कोशिश की, और कोई और डेडलॉक्स नहीं।

तो, छः स्थानों में, मुझे बस इतना करना था (TABLOCKX)।

तो, सत्र 1 में एक नष्ट बयान कुछ इस तरह दिख सकता है: शामिल हों tblQ क्ष बाएं से tblA DELETE tblX पर x ... बायाँ शामिल हों tblA एक साथ (TABLOCKX) पर tblQ.Qid = tblA.Qid जहां ... ए.क्यूआईडी नल और ...

+1

स्टैक ओवरफ्लो में आपका स्वागत है! अपना पहला उत्तर पोस्ट करने के लिए धन्यवाद। मुझे लगता है कि यह जवाब दूसरों के लिए अधिक उपयोगी होगा हालांकि यदि आपने व्यक्तिगत संदर्भ हटा दिए हैं और बुनियादी तथ्यों को रखा है। अच्छा काम करते रहें! – Caltor

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