7

हालांकि, मेरी धारणा कुछ शोध के बाद व्यक्तिपरक लगती है, लेकिन मुझे लगता है कि प्रोसेसिंग (क्लोज़/कमिट/रोलबैक) के लिए Using statement का उपयोग करने के बजाय डेवलपर्स को खोजने के लिए असामान्य नहीं है Try/CatchIDbConnection/IDbTransaction का उपयोग करने के लिए सुरक्षित उपयोग करने के लिए?

यह कुछ अनुभवी डेवलपर्स और कुछ नए लोगों के लिए भी सच है। मैं जानबूझकर स्टैक ओवरफ्लो या फ़ोरम लिंक पर किसी भी प्रश्न का संदर्भ नहीं दे रहा हूं, इसलिए लोगों को नाराज नहीं होता है। what I found से, Using कथन safe to use (कोई इरादा नहीं है)।

क्या इसमें कुछ गड़बड़ है? निम्नलिखित कोड पर विचार करें:

Public Sub Commit() 
    Dim cn As IDbConnection = {CREATE_CONNECTION} 
    Dim tran As IDbTransaction = Nothing 

    cn.Open() 
    Try 
    tran = cn.BeginTransaction 
    'run some queries here 
    tran.Commit() 
    Catch ex As Exception 
    If Not tran Is Nothing Then tran.Rollback() 
    Throw 
    Finally 
    cn.Close() 
    End Try 
End Function 

मान लें {CREATE_CONNECTION}, एक Sub कि एक कनेक्शन बनाता है, डेटाबेस वेंडर के आधार पर के लिए जगह धारक है सभी संभव सर्वोत्तम प्रथाओं के अनुसार लिखा और अधिक सुधार की जरूरत नहीं है।

Using cn As IDbConnection = {CREATE_CONNECTION} 
    cn.Open() 
    Using tran As IDbTransaction = cn.BeginTransaction 
    'run some queries here 
    tran.Commit() 
    End Using 
End Using 

:

वहाँ एक कारण है कि इसके बाद के संस्करण कोड में इस तरह के रूप में लिखा नहीं किया जा सकता है?

स्पष्ट रूप से, संस्करण # 2 यह करने के लिए और अधिक सहज है कि यह क्या कर रहा है। लेकिन शायद मुझे यहां कुछ महत्वपूर्ण याद आ रहा है? डेटा एक्सेस लाइब्रेरीज़ के विक्रेता-विशिष्ट कार्यान्वयन जैसी चीज़ें, जो और/या Connection.Close को Dispose पर आंतरिक रूप से कॉल नहीं करती हैं? क्या इस दृष्टिकोण को निकट भविष्य में हटा दिया जा रहा है, या को आधुनिक प्रोग्रामिंग पैटर्न/सर्वोत्तम प्रथाओं में पर्याप्त स्पष्ट नहीं माना गया है? Using कीवर्ड के लिए डीबग समर्थन की कमी वाले मोनो/मोबाइल ऐप्स देव उपकरण?

मैं इस बिंदु का समर्थन या इनकार करने के किसी भी प्रकार का उत्तर ढूंढ रहा हूं। अधिमानतः मूल दस्तावेज के उद्धरण वाले एक, Do not use Using with IDbTransaction when ... जैसे कुछ। ब्लॉग या व्यक्तिगत अनुभव के लिए लिंक भी ठीक है।

उत्तर

14

मैं पूरी तरह से कनेक्शन पर आपके साथ हूं; यह using होना चाहिए, और स्पष्ट Close() के लिए कोई आवश्यकता नहीं है। लेनदेन थोड़ा सा ट्रिकियर है; दिखाया गया कोड निश्चित रूप से इस समय ओवरकिल है, लेकिन यह पूरी तरह परिभाषित नहीं है कि Dispose() रोलबैक करना चाहिए। असल में, है जो मैंने देखा है हर कार्यान्वयन में क्या होता है, लेकिन यह थोड़ा परेशान है कि DbTransaction (जो कि अधिकांश प्रदाता उपयोग करते हैं) वास्तव में ऐसा नहीं करते हैं। TransactionScope पर कंट्रास्ट जहां यह स्पष्ट रूप से परिभाषित किया गया है कि Dispose() रोलबैक के रूप में प्रतिबद्ध गणना के बिना। इस कारण से, मैं का उपयोग करें (बहाना सी #) के लिए करते हैं :

using(var conn = GetOpenConnection()) 
using(var tran = conn.BeginTransaction()) { 
    try { 
     // TODO: do work 
     tran.Commit(); 
    } catch { 
     tran.Rollback(); 
     throw; 
    } 
} 

जो दोनों के बीच कहीं न कहीं जटिलता के संदर्भ में है। यह कम से कम null -checks के साथ गड़बड़ नहीं कर रहा है।

+0

यह बताता है, धन्यवाद। मेरे संस्करण # 1 की तुलना में निश्चित रूप से अधिक स्पष्ट है। 'GetOpenConnection' के लिए भी +1, मैं कुछ' CreateAndOpenConnection' में 'cn.Open()' को शामिल करने की दिशा में झुकाव भी कर रहा था, क्योंकि यह हर बार कॉल करने के लिए अनावश्यक लगता है। – Neolisk

+0

यदि डेटाबेस से कनेक्शन बंद है, तो क्या लेनदेन अभी भी वापस लुढ़का जाएगा? मैं समझता हूं कि आप संभावित लॉकिंग के बारे में अधिक चिंतित हैं। –

11

जो आप देख रहे हैं वह डेवलपर्स के अनुसार कोडिंग (एक "अच्छी बात") है। आधार वर्ग DbTransaction (सबसे डेटा प्रदाताओं 'लेन-देन कार्यान्वयन के लिए इस्तेमाल किया) its documentation में स्पष्ट रूप से कहा गया है:

निपटान लेनदेन रोलबैक करना चाहिए।हालांकि, निपटान का व्यवहार प्रदाता विशिष्ट है, और रोलबैक कॉलिंग को प्रतिस्थापित नहीं करना चाहिए।

+3

प्रलेखन –

+0

+1 पर अच्छी पकड़ लें। उस पर एक आधिकारिक नोट खोजने के लिए धन्यवाद। – Neolisk

+1

धन्यवाद। एमएस निश्चित रूप से वास्तविक इंटरफेस पर इसे स्पष्ट करना चाहिए। –

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

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