2010-05-18 12 views
7

मेरे पास how to check if you are in a transaction पर समान प्रश्न है। जांच करने के बजाय, मैं नेस्टेड लेनदेन की अनुमति कैसे दूं?मैं एडीओ.NET और SQL सर्वर के साथ नेस्टेड लेनदेन कैसे सक्षम करूं?

मैं ADO.NET के साथ Microsoft SQL Server डेटाबेस का उपयोग कर रहा हूं। मैंने टी-एसक्यूएल का उपयोग करके उदाहरण और लेनदेन नामों का उपयोग करके लेनदेन शुरू करने वाले उदाहरण देखे हैं। जब connection.BeginTransaction बुला, मैं एक ही सिलसिले में एक और फ़ंक्शन को कॉल करें, और यह BeginTransaction फिर जो मुझे अपवाद देता है कॉल:

SqlConnection does not support parallel transactions. 

यह कई माइक्रोसॉफ्ट वेरिएंट इसकी अनुमति देने के लिए प्रकट होता है, लेकिन मैं कैसे को समझ नहीं सकता इसे मेरी। एमडीएफ फ़ाइल के साथ करें।

मैं सी # और ADO.NET का उपयोग कर Microsoft SQL सर्वर डेटाबेस के साथ नेस्टेड लेन-देन की अनुमति कैसे दूं?

उत्तर

7

संपूर्ण रूप से SQL सर्वर नेस्टेड लेनदेन का समर्थन नहीं करता है। टी-एसक्यूएल में आप पहले BEGIN TRAN के अंदर BEGIN TRAN जारी कर सकते हैं लेकिन यह केवल सुविधा के लिए है। यह केवल बाहरी लेनदेन है जो मायने रखता है। SQL सर्वर (SqlConnection) के लिए .NET क्लाइंट आपको ऐसा करने की अनुमति भी नहीं देता है और जब आप कोशिश करते हैं तो यह अपवाद फेंकता है।

+0

मेरा होस्ट कहता है कि वे 'माइक्रोसॉफ्ट एसक्यूएल 2008' पेश करते हैं। क्या यह टी-एसक्यूएल है? यदि टी-एसक्यूएल कहां से नहीं आता है? मैं केवल बाहरी लेनदेन की गणना करना चाहता हूं। क्या 'माइक्रोसॉफ्ट एसक्यूएल 2008' इस अनुमति नहीं देता है? (शायद इसे अपवाद फेंकने के लिए कॉन्फ़िगर करने के लिए?) –

+0

टी-एसक्यूएल SQL सर्वर के माइक्रोसॉफ्ट का संस्करण है जो SQL सर्वर के सभी संस्करणों में चलता है। यदि आप इस अपवाद से बचना चाहते हैं, तो पहले लेनदेन को वापस करने या रोल करने से पहले 'BeginTransaction' को कॉल करने से बचें - यदि कोई लेनदेन अभी भी लंबित है तो आप लेनदेन नहीं कर सकते हैं। मैं आपको अपने आप को प्रबंधित करने की कोशिश करने के बजाय ट्रांज़ेक्शनस्कोप (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(VS.80).aspx) का उपयोग करने पर एक नज़र डालने की सलाह देता हूं। –

+0

हम्म, यह वही बात नहीं है। इस कोड का उपयोग एसक्लाइट के साथ किया गया था और मुझे यकीन नहीं है कि अगर इसका समर्थन किया जाता है (ऐसा इसलिए हो सकता है क्योंकि यह सभी ado.net का समर्थन करता है)। लेकिन यह अजीब लगता है, अगर टी-एसक्यूएल एसक्यूएल सर्वर के सभी संस्करणों में है तो क्या मेरे पास यह नहीं होना चाहिए और इसे अनुमति नहीं दी जानी चाहिए? वह एक सुविधा मेरी जिंदगी को आसान बना देगी। हालांकि यह केवल एक ही फ़ंक्शन है जो इसका उपयोग करता है (मुझे लगता है कि मैं इसे केवल इनिट पर ही नष्ट कर सकता हूं, जहां तक ​​केवल एक कनेक्शन का उपयोग नहीं किया जाता है।) –

1
SqlConnection conn = new SqlConnection(@"Data Source=test;Initial Catalog=test;User ID=usr;Password=pass"); 
conn.Open(); 
var com = conn.CreateCommand(); 

com.CommandText = "BEGIN TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "BEGIN TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "INSERT INTO testTable (ParamName,ParamValue) values ('test','test');"; 
com.ExecuteNonQuery(); 
com.CommandText = "COMMIT TRANSACTION"; 
com.ExecuteNonQuery(); 
com.CommandText = "ROlLBACK TRANSACTION"; 
com.ExecuteNonQuery(); 

com.CommandText = "SELECT COUNT(*) FROM testTable "; 

MessageBox.Show(string.Format("Found {0} rows.", com.ExecuteScalar())); 
+0

यह उत्तर आपके द्वारा चलाए जा रहे खोज के बारे में कुछ टिप्पणियों से लाभ उठा सकता है। – jocull

3

यह एक आम गलतफहमी है कि SQL सर्वर नेस्टेड लेनदेन का समर्थन करता है। ऐसा नहीं होता। कई लेनदेन खोलना और फिर प्रतिबद्धता कॉल करना बिल्कुल कुछ नहीं करता है। आप इसे स्वयं कोशिश करने के लिए आसानी से कुछ परीक्षण एसक्यूएल लिख सकते हैं। नेस्टेड लेनदेन का अनुकरण करने के लिए यहां एकमात्र विकल्प Savepoints का उपयोग करना है।

मुझे यह जोड़ना चाहिए कि एकमात्र चीज जो मायने रखती है जब @@ TRAN_COUNT शून्य तक पहुंच जाती है वह बिंदु वह बिंदु है जहां केवल बाहरी लेनदेन किया जाएगा।

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