2009-03-13 4 views
69

मुझे एक उपयोग कथन में एक आईडीबीट्रांसेक्शन मिला है, लेकिन मुझे यकीन नहीं है कि अगर किसी उपयोग कथन में अपवाद डाला जाता है तो उसे वापस ले जाया जाएगा। मुझे पता है कि एक उपयोग कथन निपटान() को बुलाएगा ... लेकिन क्या किसी को पता है कि रोलबैक() के लिए यह सच है या नहीं?कोई त्रुटि उत्पन्न होने पर एक उपयोग कथन डेटाबेस लेनदेन रोलबैक करेगा?

अद्यतन: साथ ही, क्या मुझे कमेटी() को स्पष्ट रूप से कॉल करने की आवश्यकता है जैसा कि मेरे पास है या क्या इसका उपयोग कथन का भी ख्याल रखा जाएगा?

मेरे कोड इस तरह तरह का दिखता है:

using Microsoft.Practices.EnterpriseLibrary.Data; 

... 

using(IDbConnection connection = DatabaseInstance.CreateConnection()) 
{ 
    connection.Open(); 

    using(IDbTransaction transaction = connection.BeginTransaction()) 
    { 
     //Attempt to do stuff in the database 
     //potentially throw an exception 
     transaction.Commit(); 
    } 
} 
+3

हाय, बस "प्रतिबद्ध" केस को स्पष्ट करने के लिए। यह अनिवार्य है क्योंकि,() {} बस निपटान() विधि को कॉल करें। लेनदेन। डिस्प्ले क्लास को यह नहीं पता था कि क्या कमेटी स्वचालित था या नहीं तो इसे कमेट करना चाहिए या नहीं करना चाहिए :) –

+0

यह भी देखें http://stackoverflow.com/questions/6418992/is-it-a-better-practice-to-explicitly -कॉल-लेन-देन-रोलबैक-या-लेट-ए-सिवाय – nawfal

उत्तर

85

जाहिर है हाँ (SQL सर्वर के लिए)। कि तो यह कार्यान्वयन विशिष्ट लगता है @Medinoc उल्लेख किया है कि OracleConnection नहीं करता है: यह कैसे SqlInternalTransaction के निपटान विधि (जो SqlTransaction के निपटान कॉल) Reflector से की तरह लग रहा है:

private void Dispose(bool disposing) 
{ 
    // ... 
    if (disposing && (this._innerConnection != null)) 
    { 
     this._disposing = true; 
     this.Rollback(); // there you go 
    } 
} 

संपादित करें।

+0

यह, मैंने स्पष्ट रूप से एक अपवाद फेंक कर इसे एक बार भी परीक्षण किया होगा। –

+0

यह कमाल है! हालांकि मेरे दिमाग पर एक सवाल यह है कि मुझे स्पष्ट रूप से प्रतिबद्धता कॉल करने की आवश्यकता है ... या उपयोग कथन संभाल लेंगे कि एक व्यक्ति अपने वर्तमान प्रतिबद्ध कथन को अनावश्यक रूप से प्रभावी बना देगा। – mezoid

+1

वह * कमाल है, लेकिन क्या यह आईडीबीट्रांसैक्शन के अन्य कार्यान्वयन के लिए काम करता है यदि आप इसे क्रॉस-डीबी संगतता के लिए उपयोग कर रहे हैं? –

4

मेरा मानना ​​है कि यदि कोई अपवाद है कि Commit() को कभी नहीं कहा गया था, तो लेनदेन स्वचालित रूप से रोलबैक हो जाएगा।

+0

हाँ, मेरी समझ है। एक लेनदेन तब तक रहता है जब तक एक प्रतिबद्धता नहीं कहा जाता है या कनेक्शन समाप्त होता है। उस समय लेनदेन लॉग वास्तव में परिवर्तन के साथ अद्यतन किया जाता है या बंद कनेक्शन के मामले में वापस लुढ़का जाता है (आपको पता है कि आप कभी भी बंद कनेक्शन से प्रतिबद्ध नहीं होंगे;))। – Mike

17

आपको प्रतिबद्धता कॉल करना है। उपयोग कथन आपके लिए कुछ भी नहीं करेगा।

+5

हां, उपयोग करने से बाहर निकलने पर निपटान कॉल किया जाएगा, जो रोलबैक को कॉल करेगा, कमेट नहीं। – awe

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