मैं Microsoft प्रमाणन के लिए .NET Framework 4 में डेटा एक्सेस का अध्ययन कर रहा हूं और मैं बहुत सारे परीक्षण कर रहा हूं।

इस बार मैं SqlTransaction कक्षा में IsolationLevel के उद्देश्य को समझना चाहता हूं। जैसा कि मैं समझता हूं, यह विकल्प मुझे यह तय करने की अनुमति देता है कि एक लेनदेन में अस्थिर डेटा दूसरे के लिए सुलभ है या नहीं। उदाहरण के लिए: मैं लेनदेन 1 में डेटा पंक्ति बनाता हूं और इसे करने से पहले, मैं लेनदेन 2 में डेटा पढ़ सकता हूं।

तथ्य यह है कि मैं एक से दूसरे में अस्थिर डेटा नहीं पढ़ सकता।

  • अगर मैं 2 लेनदेन के साथ 1 कनेक्शन बनाता हूं तो मुझे एक अपवाद मिलता है क्योंकि SQL सर्वर समानांतर लेनदेन का समर्थन नहीं करता है
  • यदि मैं प्रत्येक के साथ 2 कनेक्शन बनाता हूं, तो IsolationLevel के मूल्य से कोई फर्क नहीं पड़ता, जब मैं कनेक्शन 2 में डेटा एक्सेस करने का प्रयास करता हूं, जबकि कनेक्शन 1 लेनदेन में होता है, तो प्रोग्राम बंद हो जाता है। जैसे ही कनेक्शन 1 लेन-देन छोड़ता है, कार्यक्रम जारी रहता है।

तो.. IsolationLevel का क्या उपयोग है?

पीएस: मैं यहां वितरित लेनदेन के बारे में बात नहीं कर रहा हूं, बस साधारण एसक्लट्रांसक्शन।

2
André Pena 14 अप्रैल 2011, 03:54
"कोई फर्क नहीं पड़ता अलगाव स्तर का मूल्य" - सही नहीं लगता है। क्या आपने बिना पढ़े पढ़े का इस्तेमाल किया है?
 – 
Mitch Wheat
14 अप्रैल 2011, 04:09
@ मिच: हाँ, ReadUncommited सबसे कम अलगाव स्तर है और फिर भी धागा बंद हो जाता है
 – 
André Pena
14 अप्रैल 2011, 04:14

2 जवाब

सबसे बढ़िया उत्तर

2 थ्रेड्स पर आपको 2 कनेक्शन, 2 लेन-देन की आवश्यकता है।

धागा 1:

using (SqlConnection conn = GetSqlConnection())
{
  using (SqlTransaction trn = conn.BeginTransaction())
  {
    -- insert row into table here, then wait
  }
}

धागा २:

using (SqlConnection conn = GetSqlConnection())
{
  using (SqlTransaction trn = conn.BeginTransaction(IsolationLevel.<desiredlevel>))
  {
    -- wait for thread 1 to insert then read row inserted by thread 1 
  }
}

ReadUncommited के अंतर्गत दूसरा धागा पंक्ति को पढ़ेगा। Snapshot के तहत (यदि डेटाबेस में स्नैपशॉट सक्षम है) तो वह इसे नहीं देख पाएगा, लेकिन यह ब्लॉक नहीं होगा। अन्य सभी अलगाव स्तरों के तहत यह तब तक अवरुद्ध रहेगा जब तक कि थ्रेड 1 नहीं आता या वापस लुढ़क नहीं जाता।

9
Mitch Wheat 14 अप्रैल 2011, 04:10
निश्चित रूप से बढ़िया जवाब। धन्यवाद रेमस। हालांकि मुझे लगता है कि एक लेन-देन का अलगाव स्तर यह निर्धारित करेगा कि इसका अपना अस्थिर डेटा बाकी दुनिया के सामने कैसे आया। आपके उदाहरण से मुझे लगता है कि एक लेनदेन का अलगाव स्तर यह निर्धारित करता है कि यह दुनिया के बाकी हिस्सों में अस्थिर डेटा तक कैसे पहुंचता है।
 – 
André Pena
14 अप्रैल 2011, 04:21
1
@Andre: यह थोड़ा और जटिल है। गंदे पढ़ने, पढ़ने के लिए प्रतिबद्ध और स्नैपशॉट के लिए यह सच है कि अलगाव स्तर 'मेरा लेनदेन दुनिया को कैसे देखता है?' पर लागू होता है। लेकिन एक बार जब आप RepeatableRead और Serializable स्तरों पर विचार करते हैं, तो अलगाव के स्तर का अर्थ होता है 'दूसरे मेरी दुनिया को कैसे बदल सकते हैं?'। दोहराने योग्य पढ़ने के तहत अन्य कुछ भी नहीं बदल सकता है जिसे मैंने देखा (एक बार जब मैं इसे छूता हूं, तो यह हमेशा रहेगा, अपरिवर्तित, जब तक मैं प्रतिबद्ध नहीं होता), लेकिन अन्य मेरी दुनिया में नया सामान डाल सकते हैं। Serializable के अंतर्गत जो मैंने देखा उसे कोई भी संशोधित नहीं कर सकता, लेकिन मेरी दुनिया में कोई भी नई सामग्री सम्मिलित नहीं कर सकता।
 – 
Remus Rusanu
14 अप्रैल 2011, 04:39
1
और उसी रूपक के अनुसार Snapshot अलगाव का अर्थ है 'जब मैंने अपना लेन-देन शुरू किया तो मेरी दुनिया जम गई है'। हालांकि वास्तविक दुनिया बदलती है, मैं समय में फंस गया हूं और मैं हमेशा दुनिया को जैसा था देखता हूं जब मैंने अपना स्नैपशॉट लेनदेन शुरू किया (मुझे दुनिया का एक स्नैपशॉट दिखाई देता है ) बेशक, मुझे इस स्नैपशॉट में अपने स्वयं परिवर्तन दिखाई दे रहे हैं।
 – 
Remus Rusanu
14 अप्रैल 2011, 04:42
इतनी उपयोगी व्याख्या के लिए आपका बहुत-बहुत धन्यवाद। मुझे लगता है कि यह अब स्पष्ट है।
 – 
André Pena
14 अप्रैल 2011, 18:03
बहुत बढ़िया जवाब। लेकिन यह मेरे लिए स्पष्ट नहीं है कि IsolationLevel.ReadCommited में "लेकिन संशोधित किया जा सकता है" का क्या अर्थ है। क्या इसका मतलब यह है कि थ्रेड 2 में मैं थ्रेड 1 द्वारा जोड़े गए डेटा को बदल सकता हूं, लेकिन जब तक यह काम नहीं करता तब तक थ्रेड 1 से डेटा नहीं पढ़ सकता? साथ ही क्या ReadCommited का मतलब यह भी है कि लेन-देन के दौरान नया डेटा जोड़ा जा सकता है?
 – 
David Roth
14 पद 2012, 12:39
protected void Button3_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(Conn_String);
    conn.Open();

    SqlTransaction trans = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);

    SqlCommand cmd = new SqlCommand("update tbl_user_master set page_state=1", conn);

    cmd.Transaction = trans;
    cmd.ExecuteNonQuery();
    call(trans, conn);

    trans.Commit();

}

public void call(SqlTransaction trans, SqlConnection conn)
{

    SqlCommand cmd = new SqlCommand("update tbl_user_master set page_state=0", conn);
    cmd.Transaction = trans;
    cmd.ExecuteNonQuery();

}

इसका उपयोग उस स्थिति में किया जाता है जब आपके पास 1 SQL लेनदेन के साथ कई कार्य हों

1
Robert Harvey 24 सितंबर 2011, 02:03