यदि कोई त्रुटि होती है तो क्या स्टेटमेंट का उपयोग डेटाबेस ट्रांजेक्शन को रोलबैक करेगा?


83

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

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

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

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
नमस्ते, सिर्फ "प्रतिबद्ध" मामले को स्पष्ट करने के लिए। यह अनिवार्य है क्योंकि, () {} केवल डिसपोजल () विधि का उपयोग कर रहा है। लेन-देन।
विपक्षी

यह भी देखें stackoverflow.com/questions/6418992/…
nawfal

जवाबों:


104

लेन-देन वर्ग के लिए डिस्पोज़ विधि एक रोलबैक करता है, जबकि ओरेकल की कक्षा नहीं करती है। इसलिए लेन-देन के दृष्टिकोण से यह कार्यान्वयन पर निर्भर है।

usingदूसरी ओर कनेक्शन वस्तु के लिए बयान या तो डेटाबेस के लिए कनेक्शन बंद या इसे रीसेट करने के बाद पूल के लिए कनेक्शन लौट आते हैं। या तो मामले में, बकाया लेनदेन को वापस ले जाना चाहिए। यही कारण है कि एक अपवाद कभी भी आस-पास पड़े एक सक्रिय लेनदेन को नहीं छोड़ता है।

इसके अलावा, हां, आपको Commit()स्पष्ट रूप से कॉल करना चाहिए ।


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

1
यह बहुत बढ़िया है, लेकिन क्या यह IDbTransaction के अन्य कार्यान्वयन के लिए काम करता है यदि आप इसे क्रॉस-डीबी संगतता के लिए उपयोग कर रहे हैं?
मैट हैमिल्टन

4
@mezoid: कमिट अपने आप कभी नहीं होगी। @ मट्ट: उन्हें डिजाइन के अनुसार चाहिए।
सेदत कपपनोग्लू

1
@Matt Hamilton बिल्कुल उसी तरह जैसे ssg ने कहा। मैंने MySQL के .net कनेक्टर स्रोत की जाँच की, उन्होंने वही किया जो ऊपर दिखाया गया है। Rollbackमें कहा जाता है Dispose! :)
नवाफ

1
यदि आप एक का उपयोग कर रहे हैं System.Data.OracleConnection, तो यह निपटान पर रोलबैक नहीं होगा। या कम से कम, हमारे लिए यह नहीं है।
मेदिनेक

20

आपको कमिट करना पड़ेगा। उपयोग कथन आपके लिए कुछ भी नहीं करेगा।


5
हां, उपयोग करने से डिस्पोज़ एग्जिट पर आएगा, जिसे रोलबैक कहेंगे, कमिट नहीं।
भय

4

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


हाँ यही मेरी समझ है। एक लेनदेन तब तक रहता है जब तक कि एक कमिट को कॉल नहीं किया जाता है या कनेक्शन समाप्त नहीं हो जाता है। उस बिंदु पर लेन-देन लॉग वास्तव में परिवर्तनों के साथ अद्यतन किया जाता है या एक बंद कनेक्शन के मामले में वापस लुढ़क जाता है (आपको पता है कि आप कभी भी बंद कनेक्शन से बाहर नहीं निकलेंगे;))।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.