2012-01-09 15 views
5

के साथ NOLOCK मैं एक बहुप्रचारित अनुप्रयोग (सी #) पर काम कर रहा हूं, और 2 थ्रेड एक ही समय में NOLOCK का उपयोग कर तालिका अपडेट कर रहे हैं, क्या यह समस्या है? अधिक विशिष्ट होने के लिए, वे दोनों एक ही रिकॉर्ड अपडेट कर रहे हैं।मल्टीथ्रेडिंग

+3

NOLOCK का उपयोग करने के बारे में जानना आवश्यक है कि कैसे, कब, और क्यों SQL सर्वर लॉक करता है। इसे आकस्मिक रूप से इस्तेमाल नहीं किया जाना चाहिए। अगर आपको यह सवाल पूछना है, तो शायद आपको नोलोक का उपयोग नहीं करना चाहिए। –

+1

NOLOCK लेखक द्वारा आयोजित लॉक को अनदेखा करना है जब आप सिर्फ गंदा पढ़ना चाहते हैं! –

+0

अगर मुझे नोलॉक के बारे में पता था तो मैं नहीं पूछूंगा :) इस प्रकार एप्लिकेशन को मेरे काम पर लागू किया गया था और मैं समस्या को डीबग कर रहा हूं। वे अनियंत्रित हर क्वेरी में नोलॉक का उपयोग करते हैं। हमारे पास लगभग 800 संग्रहित प्रोसेस हैं। – fbhdev

उत्तर

4

उत्तर "यह निर्भर करता है"।

NOLOCK 'गंदे पढ़ने' की अनुमति देता है। इसका मतलब है कि लेनदेन के भीतर, आप किसी अन्य लेनदेन से असामान्य डेटा देख सकते हैं। यदि आपके पास एक ही पंक्ति में एक ही पंक्ति को अपडेट करने वाले एकाधिक थ्रेड हैं, तो आप उस थ्रेड को उस लेन-देन से पहले डेटा के संशोधित मान को देख सकते हैं।

उदाहरण के लिए, तालिका खाता_बुलेंस लें, जिसे परिभाषित किया गया है (account_num int, शेष दशमलव (12,2))। के निम्नलिखित मान लेते हैं होता है:

// पूर्व शर्त, खाता # 1 की 10,00

  1. थ्रेड # एक संतुलन 1 शुरू होता है एक लेन-देन हुआ, decrements खाता # 1 से 10
  2. थ्रेड # 2 शुरू होता है एक सौदे , खाता # 1 के संतुलन को पढ़ने का प्रयास करता है। यह की 0.
  3. थ्रेड # 2 एक संतुलन $ 5 से खाते decrements पढ़ता है, और (उनकी बैलेंस -5 जाता है)
  4. थ्रेड # 1 रोल बैक यह लेन-देन है
  5. थ्रेड # 2 प्रतिबद्ध ग्राहकों के लिए एक ओवरड्राफ्ट जारी करता है यह लेन-देन
  6. है

// खाते की शेष राशि अब -5 है, भले ही यह होना चाहिए 5.

क्या आप नहीं होगा देखें एक field- NOLOCK संकेत भीतर असंगत डेटा के कुछ फार्म है बहुउद्देशीय कोड के साथ चल रहा है जैसे नहीं एक लॉक- व्यक्तिगत लेखन अभी भी परमाणु हैं।

+1

यहां तक ​​कि 'पढ़ा गया अनदेखा' के तहत, लेखक लेखकों को अवरुद्ध करते हैं। इसलिए, थ्रेड 2 पंक्ति को अद्यतन करने में सक्षम नहीं होगा जब तक कि थ्रेड 1 का लेनदेन पूरा न हो जाए। इसके अलावा, यह जगह पर है। – zinglon

+0

फिक्स्ड, कैच –

+0

के लिए धन्यवाद, इसलिए यदि मैं कॉलम में 1 की उम्मीद कर रहा हूं और यह 2 के रूप में दिखाई देता है, तो यह नोलॉक के साथ कुछ भी करने के बजाय थ्रेड रेसिंग हो सकता है? – fbhdev

2

इसका मतलब है कि आप एक 'गलत' स्थिति में रिकॉर्ड प्राप्त कर सकते हैं।

उदाहरण के लिए ...

  • Process1 डेटा
  • Process2 डेटा की एक अतिव्यापी ब्लॉक पढ़ रही है के एक ब्लॉक हटा रहा है एक आदर्श स्थिति में NOLOCK

के साथ, या तो सभी प्रक्रिया 1 द्वारा हटाए जा रहे रिकॉर्ड या तो मौजूद हैं या हटाए गए हैं। क्योंकि Process2 NOLOCK का उपयोग कर रहा है, यह कुछ रिकॉर्डों की प्रक्रिया को हटा सकता है, लेकिन अन्य नहीं, क्योंकि वे पहले से ही चले गए हैं।

यह इंसर्ट्स और अद्यतनों के लिए भी जाता है। आप केवल रिकॉर्ड्स पढ़ सकते हैं जो कुछ तरीकों से बदला जा रहा है।


चाहे यह एक समस्या है अपने डेटा, अपने डिजाइन, आदि

एक खोज इंजन परवाह नहीं करेंगे अगर ऐसा होता है पर निर्भर करता है। एक वित्तीय हस्तांतरण से निपटने वाला बैंक होगा।

0

आप एक ही रिकॉर्ड को एक साथ नहीं बदल सकते हैं, भले ही नोलोक संकेत का उपयोग करें।

लेकिन

आप असंगत स्थिति में डेटा ला सकता है।

AFAIK - अद्यतन के लक्ष्य तालिका में इस संकेत को लागू करना संभव नहीं है।

और - इस संकेत की अनुमति देता है अप्रतिबद्ध डेटा को पढ़ने के लिए, उन्हें अधिलेखित नहीं।

0

सावधान रहें कि आप इसका उपयोग कैसे करते हैं। संभावित डेटा असंगतताएं।

यदि एक क्वेरी साथ (nolock) जहां कोला = "colAOldvalue"

और एक और क्वेरी (nolock) के साथ सेट colC = "colCnewValue" TableA से वह जगह है जहाँ कोला TableA से सेट कोला = "newColANewvalue" है = "colAldldue"

आप उसी रिकॉर्ड पर colc = "colCnewValue" और colA = "newColanewvalue" के साथ समाप्त कर सकते हैं। अगर यह कोई समस्या नहीं है तो ठीक है।

यह क्या चल रहा है? क्या आपको रोलॉक या पेजेलॉक के साथ प्रदर्शन समस्याएं मिल रही हैं?

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