2010-04-09 9 views
7

मान लीजिए कि मैं एकाधिक धागे से DataTable तक पहुंच रहा हूं। अगर मैं एक विशेष पंक्ति का उपयोग करना चाहते हैं, मैं मुझे लगता है कि आपरेशन लॉक करने की आवश्यकता पर शक (मैं इस बारे में गलत हो सकता है, लेकिन कम से कम मैं इस तरह से मैं सुरक्षित हूँ पता है):यदि मैं डेटारो अपडेट कर रहा हूं, तो क्या मैं संपूर्ण डेटाटेबल या केवल डेटारो लॉक करता हूं?

// this is a strongly-typed table 
OrdersRow row = null; 
lock (orderTable.Rows.SyncRoot) { 
    row = orderTable.FindByOrderId(myOrderId); 
} 

लेकिन फिर भी, अगर मैं उस पंक्ति को अपडेट करना चाहते हैं, क्या मुझे तालिका को लॉक करना चाहिए (या बल्कि, तालिका का Rows.SyncRoot ऑब्जेक्ट) फिर से, या क्या मैं बस पंक्ति को लॉक कर सकता हूं?

उत्तर

5

वास्तव में, डेटाटेबल या डेटारो पर एक ही स्थान पर केवल lock निष्पादित करना वास्तव में कुछ भी नहीं करता है। Monitor ताले का उपयोग करने में याद रखने के लिए एक महत्वपूर्ण पहलू (जो lock ब्लॉक है) यह है कि किसी ऑब्जेक्ट को लॉक करना इससे कुछ भी नहीं करता है; यह एक कारण है कि संसाधन को लॉक करने के बजाए समर्पित लॉकिंग ऑब्जेक्ट्स का उपयोग करने वाले कुछ वकील, क्योंकि यह आपको यह महसूस करने के लिए मजबूर करता है कि जब भी आप संसाधन से निपट रहे हों तो आपको लॉक (और उसी ऑब्जेक्ट पर) करना होगा।

कहा जा रहा है, यह एक बेहतर विचार पूरे DataTable लॉक करने के लिए है, के रूप में डेटा भंडारण वहीं (DataRow वस्तुओं आंतरिक रूप से उसमें केवल एक जहां डेटा पुनः प्राप्त करने के लिए के रूप में DataTable में ऑफसेट) है। इस वजह से, यदि आप अलग-अलग पंक्तियों तक पहुंच को सिंक्रनाइज़ करते हैं, तो दो को अलग-अलग पंक्तियों को अपडेट करने से आप एक ही सिंक्रनाइज़ तरीके से उसी डेटा संग्रहण तंत्र को अपडेट कर सकते हैं।

आंतरिक प्रकारों को "ब्लैक बॉक्स" के रूप में देखने और केवल आपको लॉक करने के बीच एक संघर्ष है (जो, इस मामले में, आपको केवल पंक्ति को लॉक करने के दोषपूर्ण निष्कर्ष तक ले जाएगा) और अंतर्दृष्टि प्राप्त करने का प्रयास कर रहा है प्रकार के आंतरिक कार्यों में और कार्यान्वयन विवरण पर निर्भर जो बदल सकता है।

अपशॉट यह है कि, अभी, आपको DataTable को गैर-सिंक्रनाइज़ तरीके से आंतरिक डेटा संग्रहण प्रणाली को अद्यतन करने से बचने के लिए को लॉक करना चाहिए।

+0

बहुत अंतर्दृष्टिपूर्ण उत्तर, और मैं देख सकता हूं कि आपको 'लॉक' तंत्र कैसे काम करता है यह इंगित करने की आवश्यकता क्यों महसूस हुई ... मुझे पता चला कि लॉकिंग किसी ऑब्जेक्ट को * * ऑब्जेक्ट नहीं करता है; मुझे लगता है कि एक बेहतर तरीका मैंने अपना प्रश्न लिखा होगा "क्या मुझे अद्यतन ऑपरेशन प्रति पंक्ति या प्रति-तालिका सिंक्रनाइज़ करने की आवश्यकता है?" किसी भी मामले में, यह इस बिंदु पर मुझे स्पष्ट है कि मुझे पूरी तालिका में * किसी * पंक्ति में अपडेट सिंक्रनाइज़ करना होगा - चाहे तालिका को लॉक करके या समर्पित "टेबल लॉक" (इस मामले में, मुझे लगता है कि 'पंक्तियां। SyncRoot' ऑब्जेक्ट उस उद्देश्य को वास्तव में अच्छी तरह से सेवा देता है)। –

3

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

+0

केविन द्वारा प्रदान किया गया लिंक (http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e) यह इंगित करता है कि तालिका को लॉक करना है वास्तव में, आवश्यक है। एमएसएफटी प्रतिनिधि कहता है: "मान लीजिए कि एक पंक्ति को अद्यतन करने से तालिका में किसी और चीज पर असर नहीं पड़ेगा क्योंकि आप एक संभावित कार्यान्वयन विस्तार पर भरोसा कर रहे हैं जिसे आसानी से बाद की तारीख में तोड़ दिया जा सकता है।" क्या आपके पास कोई अंतर्दृष्टि है कि यह सच है या नहीं? –

3

datatable केवल सुरक्षित है बहु लड़ी के लिए आपरेशन पढ़ें:

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

datatable के बारे में पढ़ पर वहाँ मेज ताला और आप सुरक्षित रूप से करने के लिए अनुमति देने के लिए क्षमता के विषय में परस्पर विरोधी जानकारी है एक पंक्ति में डेटा अद्यतन करें। दूसरे लिंक के अनुसार आप तालिका को लॉक कर सकते हैं और पंक्ति को अपडेट कर सकते हैं। यह एक एमएस एमवीपी से है, मैं कहूंगा कि आप शायद तालिका को लॉक कर सकते हैं और ठीक हो सकते हैं।

+1

लिंक कहता है: "यह प्रकार मल्टीथ्रेडेड रीड ऑपरेशंस के लिए सुरक्षित है। आपको किसी भी लेखन ऑपरेशन को सिंक्रनाइज़ करना होगा" क्या इसका मतलब यह नहीं है कि मल्टीथ्रेडेड एक्सेस के लिए लॉक सही काम है? – code4life

+0

मैं उलझन में हूं; आपके द्वारा प्रदान किया गया पहला लिंक यह कहता है कि आपको केवल लिखने की आवश्यकता है (हालांकि यह नहीं कहता है * क्या * लॉक करना है)। दूसरा यह इंगित करता है कि तालिका को लॉक करना सही दृष्टिकोण है। न तो आपके बयान से सहमत है कि आप तालिका को लॉक नहीं कर सकते हैं और उम्मीदों को सुसंगत होने की उम्मीद करते हैं। क्या मैं कुछ भूल रहा हूँ? –

+0

मेरा पहला बयान गलत था। मुझे विवादित जानकारी मिली। डेटा को पढ़ने के लिए आपको तालिका को लॉक करने की आवश्यकता नहीं है क्योंकि यह ठीक है। डेटा लिखने के लिए आपको टेबल को लॉक करने की आवश्यकता है। – kemiller2002

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