मेरे पास एक मूल वस्तु (एक डीएएल का हिस्सा) है जिसमें अन्य चीजों के साथ, बाल वस्तुओं के संग्रह (List<t>
) शामिल हैं।लेनदेनस्कोप: वितरित लेनदेन से बचें
जब मैं ऑब्जेक्ट को डीबी पर वापस सहेज रहा हूं, तो मैं अभिभावक को दर्ज/अपडेट करता हूं, और फिर प्रत्येक बच्चे के माध्यम से लूप करता हूं। रखरखाव के लिए, मैंने बच्चे के लिए सभी कोड एक अलग निजी विधि में डाल दिया है।
मैं मानक एडीओ लेनदेन का उपयोग करने जा रहा था, लेकिन मेरी यात्रा पर, मैंने ट्रांज़ेक्शनस्कोप ऑब्जेक्ट में ठोकर खाई, जो मुझे विश्वास है कि मुझे मूल विधि में सभी डीबी इंटरैक्शन को लपेटने में सक्षम बनाता है (बाल विधि में सभी बातचीत के साथ) एक लेनदेन में।
अभी तक इतना अच्छा ..?
तो अगला सवाल यह है कि इस लेनदेनस्कोप के भीतर कनेक्शन कैसे बनाएं और उपयोग करें। मैंने सुना है कि कई कनेक्शनों का उपयोग करते हुए, भले ही वे एक ही डीबी के लिए हों, लेनदेन स्कोप को यह सोचने के लिए मजबूर कर सकते हैं कि यह एक वितरित लेनदेन है (कुछ महंगा डीटीसी काम शामिल है)।
क्या मामला है? या यह है, जैसा कि मैं कहीं और पढ़ रहा हूं, एक मामला जो एक ही कनेक्शन स्ट्रिंग का उपयोग कर रहा है (जो खुद को कनेक्शन पूलिंग में उधार देगा) ठीक होगा?
अधिक व्यावहारिक रूप से बोल रहा है, मैं ...
- माता पिता & बच्चे में अलग कनेक्शन बनाएं (एक ही कनेक्शन स्ट्रिंग के साथ यद्यपि)
- माता पिता में एक कनेक्शन बनाएँ एक एक के रूप में यह माध्यम से पारित पैरामीटर (मुझे बेकार लगता है)
- कुछ और करें ...?
अद्यतन:
हालांकि यह प्रतीत होता है कि मैं का उपयोग कर मेरी हमेशा की तरह .NET3.5 + और एसक्यूएल सर्वर 2008 + ठीक हो सकता है, इस परियोजना के दूसरे हिस्से ओरेकल (10g) तो मैं का उपयोग किया जाएगा एक तकनीक का अभ्यास भी कर सकते हैं जिसे परियोजनाओं में लगातार इस्तेमाल किया जा सकता है।
तो मैं बस बाल विधियों के माध्यम से कनेक्शन पास कर दूंगा।
विकल्प 1 कोड नमूना:
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.Connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
try
{
//create & add parameters to command
//save parent object to DB
cmd.ExecuteNonQuery();
if ((int)cmd.Parameters["@Result"].Value != 0)
{
//not ok
//rollback transaction
ts.Dispose();
return false;
}
else //enquiry saved OK
{
if (update)
{
enquiryID = (int)cmd.Parameters["@EnquiryID"].Value;
}
//Save Vehicles (child objects)
if (SaveVehiclesToEPE())
{
ts.Complete();
return true;
}
else
{
ts.Dispose();
return false;
}
}
}
catch (Exception ex)
{
//log error
ts.Dispose();
throw;
}
}
}
}
देखें [ट्रांज़ेक्शनस्कोप स्वचालित रूप से कुछ मशीनों पर एमएसडीटीसी में बढ़ रहा है?] (Http://stackoverflow.com/questions/1690892/transactionscope-automatically-escalating-to-msdtc-on-some-machines/1693795#1693795)। कई अच्छे उत्तर हैं, लेकिन जो मैंने लिंक किया है वह सबसे संक्षिप्त (और आपके प्रश्न के लिए प्रासंगिक है)। उपरोक्त यह है कि, यदि आप .NET 2.0 और SQL Server 2005 का उपयोग कर रहे हैं, तो आप एक ही कनेक्शन स्ट्रिंग वाले दो कनेक्शन का उपयोग करके भी बढ़ेंगे। यह .NET 3.5 और SQL Server 2008 के साथ कोई समस्या नहीं है। –
मैं * .NET 3.5/4 और SQL 2008 का उपयोग कर रहा हूं, लेकिन कभी-कभी मैं SQL2005/2000 का उपयोग कर सकता हूं, इसलिए वैसे भी याद रखना उचित है। धन्यवाद – CJM
क्या कोई मुझे वितरित लेनदेन के बारे में कुछ जानकारी दे सकता है। उदाहरण के साथ समझाओ। – Thomas