मैं Microsoft प्रमाणन के लिए .NET Framework 4 में डेटा एक्सेस का अध्ययन कर रहा हूं और मैं बहुत सारे परीक्षण कर रहा हूं।
इस बार मैं SqlTransaction
कक्षा में IsolationLevel
के उद्देश्य को समझना चाहता हूं। जैसा कि मैं समझता हूं, यह विकल्प मुझे यह तय करने की अनुमति देता है कि एक लेनदेन में अस्थिर डेटा दूसरे के लिए सुलभ है या नहीं। उदाहरण के लिए: मैं लेनदेन 1 में डेटा पंक्ति बनाता हूं और इसे करने से पहले, मैं लेनदेन 2 में डेटा पढ़ सकता हूं।
तथ्य यह है कि मैं एक से दूसरे में अस्थिर डेटा नहीं पढ़ सकता।
- अगर मैं 2 लेनदेन के साथ 1 कनेक्शन बनाता हूं तो मुझे एक अपवाद मिलता है क्योंकि SQL सर्वर समानांतर लेनदेन का समर्थन नहीं करता है
- यदि मैं प्रत्येक के साथ 2 कनेक्शन बनाता हूं, तो IsolationLevel के मूल्य से कोई फर्क नहीं पड़ता, जब मैं कनेक्शन 2 में डेटा एक्सेस करने का प्रयास करता हूं, जबकि कनेक्शन 1 लेनदेन में होता है, तो प्रोग्राम बंद हो जाता है। जैसे ही कनेक्शन 1 लेन-देन छोड़ता है, कार्यक्रम जारी रहता है।
तो.. IsolationLevel का क्या उपयोग है?
पीएस: मैं यहां वितरित लेनदेन के बारे में बात नहीं कर रहा हूं, बस साधारण एसक्लट्रांसक्शन।
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 नहीं आता या वापस लुढ़क नहीं जाता।
RepeatableRead
और Serializable
स्तरों पर विचार करते हैं, तो अलगाव के स्तर का अर्थ होता है 'दूसरे मेरी दुनिया को कैसे बदल सकते हैं?'। दोहराने योग्य पढ़ने के तहत अन्य कुछ भी नहीं बदल सकता है जिसे मैंने देखा (एक बार जब मैं इसे छूता हूं, तो यह हमेशा रहेगा, अपरिवर्तित, जब तक मैं प्रतिबद्ध नहीं होता), लेकिन अन्य मेरी दुनिया में नया सामान डाल सकते हैं। Serializable
के अंतर्गत जो मैंने देखा उसे कोई भी संशोधित नहीं कर सकता, लेकिन मेरी दुनिया में कोई भी नई सामग्री सम्मिलित नहीं कर सकता।
Snapshot
अलगाव का अर्थ है 'जब मैंने अपना लेन-देन शुरू किया तो मेरी दुनिया जम गई है'। हालांकि वास्तविक दुनिया बदलती है, मैं समय में फंस गया हूं और मैं हमेशा दुनिया को जैसा था देखता हूं जब मैंने अपना स्नैपशॉट लेनदेन शुरू किया (मुझे दुनिया का एक स्नैपशॉट दिखाई देता है ) बेशक, मुझे इस स्नैपशॉट में अपने स्वयं परिवर्तन दिखाई दे रहे हैं।
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 लेनदेन के साथ कई कार्य हों
संबंधित सवाल
नए सवाल
.net
.NET कोर के बारे में प्रश्नों के लिए उपयोग न करें - इसके बजाय [.net-core] का उपयोग करें। .NET फ्रेमवर्क मुख्य रूप से माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम के लिए डिज़ाइन किया गया एक सॉफ्टवेयर फ्रेमवर्क है। इसमें बेस क्लास लाइब्रेरी, कॉमन लैंग्वेज रनटाइम (आमतौर पर सीएलआर के रूप में संदर्भित), कॉमन टाइप सिस्टम (आमतौर पर सीटीएस के रूप में संदर्भित) और डायनेमिक भाषा रनटाइम का कार्यान्वयन शामिल है। यह C #, VB.NET, F # और C ++ / CLI सहित कई प्रोग्रामिंग भाषाओं का समर्थन करता है।