2012-02-29 29 views
7

मैंने सी # में SqlTransaction को शुरू करने, प्रतिबद्ध करने और रोलबैक लेनदेन के लिए लागू किया है। सब ठीक हो रहा है, लेकिन लेनदेन के दौरान कनेक्शन में आने वाली उन तालिकाओं तक पहुंचने में मुझे कुछ समस्या आई है। मैं लेनदेन के दौरान तालिका को पढ़ने में सक्षम नहीं था (वे तालिका जो लेनदेन में हैं)। इस बारे में खोज करते समय, मैंने पाया कि यह एक विशेष लॉक के कारण होता है। उस डेटा पर किसी भी बाद के चयन को अनन्य लॉक को रिलीज़ होने की प्रतीक्षा करनी होगी। फिर, मैं SqlTransaction द्वारा प्रदान किए गए प्रत्येक अलगाव स्तर से गुज़र चुका हूं, लेकिन यह काम नहीं करता है। तो, मुझे लेन-देन के दौरान विशेष लॉक जारी करने की आवश्यकता है ताकि अन्य उपयोगकर्ता उस तालिका तक पहुंच प्राप्त कर सकें और डेटा पढ़ सकें। क्या यह प्राप्त करने के लिए कोई तरीका है? अग्रिम धन्यवाद।एसक्यूएल लेनदेन में अलगाव स्तर

यहाँ लेनदेन

try 
{ 
    SqlTransaction transaction = null;       
    using (SqlConnection connection=new SqlConnection(Connection.ConnectionString)) 
    { 
     connection.Open(); 
     transaction=connection.BeginTransaction(IsolationLevel.Snapshot,"FaresheetTransaction");    
     //Here all transaction occurs 
     if (transaction.Connection != null) 
     {  
       transaction.Commit(); 
       transaction.Dispose(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    if (transaction.Connection != null) 
     transaction.Rollback(); 
    transaction.Dispose(); 
} `       

इस कोड को ठीक काम कर रहा है के लिए मेरे ग # कोड है, लेकिन समस्या यह है कि जब मैं लेन-देन के समय के दौरान टेबल के डेटा (लेनदेन के दौरान पहुँचा उन) का उपयोग। आवेदन के अन्य भागों द्वारा टेबल का उपयोग किया जा रहा है। इसलिए, जब मैंने टेबल से डेटा पढ़ने की कोशिश की, तो यह एक अपवाद फेंकता है।

+1

क्या आपके यहाँ इरादा है? जब अद्यतन करने कोई लॉक नहीं ले? या अन्य पाठकों के लिए ताले को अनदेखा करना है? (जो बहुत अच्छे कारणों से हैं) –

+1

मैं अन्य उपयोगकर्ताओं के लिए ट्रांज़ेक्टेड टेबल में लॉक नहीं करना चाहता हूं .... लेनदेन लंबी अवधि के लिए जा सकता है क्योंकि लेनदेन के समय, टेबल में हजारों डेटा प्रविष्टियां हैं, इसलिए शायद यह लंबा समय लगेगा ... तो, ट्रैन की अवधि में सक्शन, मैं चाहता हूं कि अन्य उपयोगकर्ता उस टेबल पर पहुंच प्राप्त करें और डेटा पढ़ सकें ....... –

उत्तर

14

एक एसक्यूएल लेनदेन, डिजाइन द्वारा, एसीआईडी ​​है। विशेष रूप से, यह "मैं" है जो आपको यहां चोट पहुंचा रहा है - यह असंगत मध्यवर्ती राज्य को देखने वाले अन्य कनेक्शनों को रोकने के लिए डिज़ाइन किया गया है।

एक व्यक्ति पढ़ने कनेक्शन NOLOCK संकेत, या READ UNCOMMITTED अलगाव स्तर का उपयोग करके इस नियम की अनदेखी करने के लिए चुनाव कर सकते हैं, लेकिन यह लगता है कि आप चाहते हैं कनेक्शन ताले नहीं लेने के लिए लिखने के लिए है। खैर, ऐसा होने वाला नहीं है।

हालांकि, पराक्रम में पाठकों की सहायता स्नैपशॉट अलगाव है, जो पाठक ताले लेने (को देखकर बिना अलगाव को प्राप्त होता है का उपयोग करने के लिए, के रूप में नाम का सुझाव, लगातार राज्य के एक बिंदु-इन-टाइम shapshot है जब लेनदेन शुरू हुआ)।

  • कई, अधिक बारीकी से, लेन-देन लेखक
  • एक मचान तालिका में काम करने से (डेटा की एक समानांतर प्रतिलिपि):

    हालांकि, IMO आप बेहतर या तो को देखने के लिए सलाह दी जाती है , फिर, कुछ बड़े पैमाने पर सम्मिलित/अपडेट करने/हटाने के संचालन में असली डेटा में मर्ज किए है कि लेनदेन समय

कम से कम पहले सरल है।

सरल तथ्य यह है कि: यदि आप लंबे समय से चलने वाले लेन-देन करते हैं जो बहुत सारे डेटा पर चलते हैं, हाँ आप समस्याएं पैदा करने जा रहे हैं। यही कारण है कि आप ऐसा नहीं करते हैं। सिस्टम सही ढंग से काम कर रहा है।

+2

आपका दूसरा समाधान आपके द्वारा उपयोग किए जाने पर स्नैपशॉट अलगाव आपके लिए बहुत कुछ कर रहा है एक लेनदेन के लिए जो लिखता है;) – ntziolis

+0

मैंने स्नैपशॉट अलगाव स्तर का उपयोग किया है लेकिन फिर यह एक ही समस्या देता है ....दरअसल यह तब काम करता है जब मैं "select * tbl_name से (nolock)" का चयन करता हूं लेकिन यह चयन मेरे लिए उपयुक्त नहीं है: 1. यह पहले से ही लेनदेन के डेटा को प्रदर्शित करता है जो अभी तक प्रतिबद्ध नहीं है। 2. तालिका को पहले से ही आवेदन से पूछताछ की गई है, इसलिए मेरे लिए कोड में सभी क्वेरी के माध्यम से जाना संभव नहीं है और इसे बदलना ...... –

+1

@ akash88 यह ** पाठक ** है जिसे स्नैपशॉट अलगाव का उपयोग करने की आवश्यकता है; अगर यह मदद नहीं करता है, तो मुझे आश्चर्य है कि क्या आपने स्नैपशॉट अलगाव को सक्षम नहीं किया है। लेकिन मूल रूप से, आप सिस्टम के खिलाफ कुछ ऐसा करने की कोशिश कर रहे हैं। एक उदाहरण बराबर हो सकता है "जब मैं इसके बड़े हिस्से को फिर से लिखता हूं तो मेरे पास एक बड़ी फ़ाइल खुलती है; मैं साझा एक्सेस की अनुमति नहीं देना चाहता क्योंकि पाठकों को प्रगति के संपादन दिखाई देंगे, लेकिन फ़ाइल बंद होने तक लॉक नहीं है यह! मैं इसे कैसे ठीक करूं? " उत्तर: आप नहीं करते; आप सिस्टम को अलग-अलग डिजाइन करते हैं। –

3

लेनदेन के भीतर भी अपने पढ़ने को निष्पादित करने का प्रयास करें और अलगाव स्तर READ UNCOMMITTED का उपयोग करें। यह बंद होने से पढ़ा नहीं कर पाएगा, लेकिन अवैध परिणाम हो सकता है:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  
BEGIN TRANSACTION 

SELECT * FROM Table 

COMMIT TRANSACTION 

कि लेन-देन के साथ काम/अलगाव स्तरों केवल मायने रखती है, जब लेखन जबकि वास्तव में इस समान रूप से महत्वपूर्ण है जब पढ़ने है एक गलत धारणा है।

+0

प्रतिक्रिया के लिए धन्यवाद ..... मैंने सभी प्रकार के अलगाव स्तर का उपयोग किया है लेकिन यह मेरे परिदृश्य के साथ काम कर सकता है। .. असल में, मैं इसे सी # में एसक्लट्रांसक्शन की BeginTransaction() विधि का उपयोग कर उपयोग कर रहा हूं .... मैं उन तालिकाओं के लिए अन्य उपयोगकर्ता तक पहुंच देना चाहता हूं जो लेनदेन में संदेह कर रहे हैं ..... लेकिन, प्रत्येक अलगाव स्तर में, विशेष लॉक हो रहा है ........ –

+0

यदि आप टेबल पर लिख रहे हैं तो विशेष ताले अनिवार्य हैं। एकमात्र अपवाद तब होता है जब आप अलगाव स्तर स्नैपशॉट का उपयोग करते हैं, लेकिन जहां तक ​​मुझे पता है कि यह केवल एसक्यूएल 2008 से शुरू हो रहा है। इसलिए पढ़ने की अनुमति देने का एकमात्र तरीका – ntziolis

+0

से ऊपर बताए गए पढ़ने के दौरान पढ़ने के लिए असामान्य या अराजकता अलगाव स्तर का उपयोग करना है चेक किया गया, स्नैपशॉट अलगाव एसक्यूएल 2005 में पहले से उपलब्ध है, इसलिए आप वहां जाते हैं। लिखते समय स्नैपशॉट अलगाव का प्रयोग करें और आपको जाने के लिए अच्छा होना चाहिए। चूंकि आप केवल अन्य परिचालनों में पढ़ रहे हैं, इसके साथ कोई समस्या नहीं होनी चाहिए। – ntziolis

2

समस्या डेटाबेस में लिखने के स्तर पर नहीं बल्कि पढ़ने के मानों के स्तर पर है। आप डालने वाले मानों को पढ़ने की कोशिश कर रहे हैं। निम्नलिखित करने के लिए अपने चयन क्वेरी को बदलने के लिए प्रयास करें:

select * from your_table_with_inserts with (nolock) 

हालांकि यह एक वर्तमान लेन-देन के अलगाव के स्तर को ओवरराइड करता है और पैदा कर सकता है गंदा पढ़ता है।

तो सवाल यह है कि: यदि आप सभी प्रश्नों पर लेनदेन का उपयोग कर रहे हैं या केवल सम्मिलित/अपडेट करते हैं?

1

@ AKASH88, SNAPSHOT अलगाव स्तर वह है जिसे आप ढूंढ रहे हैं।

आप कहते हैं कि स्नैपशॉट के साथ भी यह अपेक्षित काम नहीं कर रहा है, विशेष लॉक हो रहा है, मैं समझ सकता हूं कि, मुझे एक ही समस्या थी।

सुनिश्चित करें कि आप डेटाबेस विकल्पों पर केवल SNAPSHOT सक्षम नहीं करते हैं, लेकिन पढ़ें सबमिट किए गए स्नैपशॉट चालू होना चाहिए।

enter image description here

यह एसक्यूएल सर्वर 2008 है, तो यह है कि अगर यह जवाब में मदद मिलेगी :(

सादर अभी भी अनिश्चित है!

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

  • कोई संबंधित समस्या नहीं^_^